var express = require('express');
var router = express.Router();
var qiniu = require('qiniu');
var rpcFunc=require('../routes/rpcSrv/rpcFunc.js');
var superagent = require('superagent');

var ItbNotificationModel = require('../../common/mysql/mapping/ItbNotificationModel');
var ItbTemplateModel = require('../../common/mysql/mapping/ItbTemplateModel');
var ItbTmplPageModel = require('../../common/mysql/mapping/ItbTmplPageModel');
var ItbDocumentModel = require('../../common/mysql/mapping/ItbDocumentModel');
var ItbPageModel = require('../../common/mysql/mapping/ItbPageModel');
var ItbUserModel = require('../../common/mysql/mapping/ItbUserModel');
var ItbBrowseInfoModel = require('../../common/mysql/mapping/ItbBrowseInfoModel');
var ItbRelayInfoModel = require('../../common/mysql/mapping/ItbRelayInfoModel');
var ItbCollectModel = require('../../common/mysql/mapping/ItbCollectModel');
var OSSMgr = require('../../common/util/OSSMgr');
var CONFIG = require('../../common/config');
var CODE = require('../../common/code');
var homeUtil  = require('./util/homeUtil.js')

var async = require( 'async'); // 同步控制

var nodemailer = require('nodemailer');
var moment = require('moment');  // 日期格式化

var BASE_IP = CONFIG.BASE_IP;


//------------------------------------------------------------------

/* 获取主页数据.
 * 方式:GET
 * pc:1表示从pc来的请求/2表示美化大师来的请求/101表示从android来的请求/102表示从ios来的请求
 * 参数:type:0最新/1行业/2用途
 * 参数:verFlg:用户文档／模版分表后版本传1
 * 参数:code:(即type_id,不限时为0)
 *          在type为0时,表示最新
 *          在type为1时,表示行业
 *          在type为2时,表示用途
 * 参数:pageNum:页码,从0开始
 * 参数:pageSize:每页容量
 * 参数［可选］:withTotalPage:1表示需要返回总页数（在verFlg＝＝1时有效）
 * */
function getHomeInfo(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var type = req.body.type || req.query.type;
    var code = req.body.code || req.query.code;
    var pageNum = req.body.pageNum || req.query.pageNum;
    var pageSize = req.body.pageSize || req.query.pageSize;
    var verFlg = Number(req.body.verFlg || req.query.verFlg || '0');
    var withTotalPage = req.body.withTotalPage || req.query.withTotalPage || 0;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof type=='undefined' || type == null || type.trim().length == 0){
        return ret_func(0,CODE.DOC_TYPE_EMPTY);
    } else if (type != 0) {
        if(typeof code=='undefined' || code == null || code.trim().length == 0){
            return ret_func(0,CODE.DOC_TYPE_EMPTY);
        }
    }
    if(typeof pageNum=='undefined' || pageNum == null || pageNum.trim().length == 0){
        return ret_func(0,CODE.PAGENUM_EMPTY);
    }
    if(typeof pageSize=='undefined' || pageSize == null || pageSize.trim().length == 0){
        return ret_func(0,CODE.PAGESIZE_EMPTY);
    }

    // 分页: 跳过条数
    var skipCnt = Number(pageNum) * Number(pageSize);

    function proc_func(items, totalPageCount) {
        var retData = [];
        for (var i in items) {
            var item = items[i];
            var itemData = {
                "base_doc_id": item.doc_id,
                "image": item.thumb_s,
                "title": item.doc_name,
                "style": item.type_name,
                "createDate": item.create_time,
                "pageCount": item.page_count
            }
            if(withTotalPage){
                itemData.totalPageCount = totalPageCount;
            }
            retData.push(itemData);
        }
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    }

    var entity = new ItbDocumentModel({
    });
    // 分页查询
    if (verFlg == 1) {
        entity.getDocAndPagesInfoByType2(function(err, items){
            if (err){
                console.log('home.js [getHomeInfo] select2 error: '+err);
                return ret_func(0,CODE.OPERATION_FAILED);
            }
            if(withTotalPage){
                entity.getDocAndPagesCountInfoByType2(function(err2, count){
                    if (err){
                        console.log('home.js [getHomeInfo] getDocAndPagesCountInfoByType2 error: '+err);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    proc_func(items, Math.floor((count-1)/pageSize)+1);
                }, type, code);

            }else{
                proc_func(items);
            }

        }, type, code, skipCnt, pageSize);

    } else {
        entity.getDocAndPagesInfoByType(function(err, items){
            if (err){
                console.log('home.js [getHomeInfo] select error: '+err);
                return ret_func(0,CODE.OPERATION_FAILED);
            }

            proc_func(items);

        }, type, code, skipCnt, pageSize);
    }

    //var obj = {
    //    success:1,msg:'success',
    //    "data": [
    //        {
    //            "base_doc_id": 1,
    //            "image": BASE_IP + '/images/1.jpg',
    //            "title": "乐工作 悦生活 自我充电课程",
    //            "style": "发布会",                      // 分类(路演, 发布会等)
    //            "createDate": "2015-03-31 10:51",
    //            "pageCount":23
    //        },
    //        {
    //            "base_doc_id": 2,
    //            "image": BASE_IP + '/images/2.jpg',
    //            "title": "Project analysis",
    //            "style": "路演",                      // 分类
    //            "createDate": "2015-03-31 10:51",
    //            "pageCount":23
    //        },
    //    ]
    //
    //};
}
router.get('/getHomeInfo', getHomeInfo);
router.post('/getHomeInfo', getHomeInfo);


//------------------------------------------------------------------
/* 获取某文档的预览图.（只要有未生成预览图的页面就返回error）
 * 方式:GET
 * 参数:mobile: 1手机/2PC
 * 参数 tmpl_flg: 0用户文档,1模版 (为兼容之前版本,默认为0)
 * 参数 id: 文档或模版id
 * 返回值：如果没有预览图，则data为空数组
 * */
function getDocPreview(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var doc_id = req.body.id || req.query.id;
    var tmpl_flg = Number(req.body.tmpl_flg || req.query.tmpl_flg || "0");

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var entity = new ItbPageModel({
        doc_ids:doc_id
    });
    entity.getPagesInfoByDocIds(function(error, items){
        if(error){
            console.log('home.js [getDocPreview] error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // process success
        var pageData = [];
        if (items != null && items.length > 0) {
            for (var i in items){
                var item = items[i];

                // 只要有未生成预览图的页面就返回error
                if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                    return ret_func(0,CODE.PAGE_THUMB_EMPTY);
                }

                // 组合page数据
                var pageItem = {
                    base_page_id: item.page_id,
                    image: item.thumb_s
                };
                pageData.push(pageItem);
            }
        }

        return ret_func(1,CODE.OPERATION_SUCCESS,pageData);
    });

    //var obj = {
    //    success:1,msg:'success',
    //    "data": [
    //        {
    //            "base_page_id": 1,
    //            "image": BASE_IP + '/images/page1.jpg'
    //        },
    //        {
    //            "base_page_id": 2,
    //            "image": BASE_IP + '/images/page2.jpg'
    //        },
    //    ]
    //};
}
router.get('/getDocPreview', getDocPreview);
router.post('/getDocPreview', getDocPreview);

//------------------------------------------------------------------
/* 获取某文档的预览图（只要有未生成预览图的页面就重新排版,生成预览图）
 * 方式:GET
 * 参数:mobile:1手机/2PC
 * 参数:id:文档id
 * 返回值：如果没有预览图，则data为空数组
 * */
function getDocPreview2(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var doc_id = req.body.id || req.query.id;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var entity = new ItbPageModel({
        doc_ids:doc_id
    });
    entity.getPagesInfoByDocIds(function(error, items){
        if(error){
            console.log('home.js [getDocPreview] get error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // process success
        var pageData = [];
        var doTypeset = false
        if (items != null && items.length > 0) {
            for (var i in items){
                var item = items[i];

                // 只要有未生成预览图的页面就返回error
                if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                    doTypeset = true;
                    break;
                }

                // 组合page数据
                var pageItem = {
                    base_page_id: item.page_id,
                    image: item.thumb_s
                };
                pageData.push(pageItem);
            }
        }

        if (doTypeset) {
            // 重新排版
            rpcFunc.typesetDoc(doc_id, function (ret) {
                // 再次获取
                entity.getPagesInfoByDocIds(function (err, items2) {
                    if (err) {
                        console.log('home.js [getDocPreview] re-get error: ' + err);
                        return ret_func(0, CODE.OPERATION_FAILED);
                    }

                    // process success
                    pageData = [];
                    if (items2 != null && items2.length > 0) {
                        for (var n in items) {
                            var item = items2[n];

                            // 只要有未生成预览图的页面就返回error
                            if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                                return ret_func(0, CODE.PAGE_THUMB_EMPTY);
                            }

                            // 组合page数据
                            var pageItem = {
                                base_page_id: item.page_id,
                                image: item.thumb_s
                            };
                            pageData.push(pageItem);
                        }
                    }

                    return ret_func(1, CODE.OPERATION_SUCCESS, pageData);
                });
            });
        } else {
            return ret_func(1,CODE.OPERATION_SUCCESS,pageData);
        }
    });
}
router.get('/getDocPreview2', getDocPreview2);
router.post('/getDocPreview2', getDocPreview2);

//------------------------------------------------------------------

/* 取得“当前文档“的“模版”的页预览图
 * 如果传入的是“模版”id，则返回“模版”的页预览图；如果传入的是“用户文档”id，则返回“用户文档”对应的“模版”的页预览图
 * 方式:GET
 * 参数:mobile:1手机/2PC
 * 参数:id: 文档id
 * 参数:backup: 保留页flg (如果backup为1取得包括保留页在内的所有页; 如果为0或者空,则只取得普通页)
 * 返回值: 如果没有预览图，则data为空数组
 * */
function getTemplatePreview(req, res, next) {

    //var obj = {
    //    success:1,msg:'success',
    //    "data": [
    //        {
    //            "base_doc_id": 0,
    //            "base_page_id": 1,
    //            "page_index": 0,
    //            "image": BASE_IP + '/images/page1.jpg'
    //        },
    //        {
    //            "base_doc_id": 0,
    //            "base_page_id": 2,
    //            "page_index": 1,
    //            "image": BASE_IP + '/images/page2.jpg'
    //        },
    //    ]
    //};

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var doc_id = req.body.id || req.query.id;
    var backup_flg = Number(req.body.backup || req.query.backup || "0");

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var docEntity = new ItbDocumentModel({
        doc_id:doc_id,
        del_flg:0
    });
    docEntity.findFromDB(function (error, items) {
        items = items||[];

        if(error){
            console.log('home.js [getTemplatePreview] find doc error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // 未检索到document返回[]
        if(items.length==0){
            console.log('home.js [getTemplatePreview] doc not found');
            return ret_func(1,CODE.OPERATION_SUCCESS,[]);

        } else {
            // 用base_doc_id检索
            var entity = new ItbPageModel({
                doc_ids: items[0].base_doc_id || doc_id
            });
            entity.getPagesInfoByDocIds(function(error, items){
                if(error){
                    console.log('home.js [getTemplatePreview] find page error: '+error);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                // process success
                var pageData = [];
                if (items != null && items.length > 0) {
                    for (var i in items){
                        var item = items[i];
                        if (backup_flg == 0) {// 只获取普通页
                            if (Number(item.backup_flg)>0) continue;// 过滤保留页
                        }

                        // 只要有未生成预览图的页面就返回error
                        if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                            return ret_func(0,CODE.PAGE_THUMB_EMPTY);
                        }

                        // 组合page数据
                        var pageItem = {
                            base_doc_id: item.doc_id,
                            base_page_id: item.page_id,
                            page_index: item.page_index,
                            image: item.thumb_s
                        };
                        pageData.push(pageItem);
                    }
                }

                return ret_func(1,CODE.OPERATION_SUCCESS,pageData);
            });
        }
    });

}
router.get('/getTemplatePreview', getTemplatePreview);
router.post('/getTemplatePreview', getTemplatePreview);

//------------------------------------------------------------------
/* 取得[当前文档]的[模版]的页预览图
 * 用于[用户文档]和[模版文档]分表后的版本,逻辑和接口[getTemplatePreview]类似
 * 如果传入的是[模版id],则返回[模版]的页预览图
 * 如果传入的是[用户文档id],则返回[用户文档]对应的[模版]的页预览图
 *
 * 方式:GET
 * 参数 mobile:1手机/2PC
 * 参数 tmpl_flg: 模版flg,默认为0
 *               等于1时id表示tmpl_id,
 *               等于0时id表示doc_id
 * 参数 id: 用户文档id/模版id
 * 参数 backup: 保留页flg,默认为0
 *             等于1时,取得包括保留页在内的所有页
 *             等于0时,只取得普通页
 *
 * 返回值: 如果没有预览图，则data为空数组
 * */
function getTmplPreview(req, res, next) {

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var tmpl_flg = Number(req.body.tmpl_flg || req.query.tmpl_flg || "0");
    var doc_id = req.body.id || req.query.id;
    var backup_flg = Number(req.body.backup || req.query.backup || "0");

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var entity;
    if (tmpl_flg == 1) {
        // 模版
        entity = new ItbTemplateModel({
            tmpl_id:doc_id,
            del_flg:0
        });

    } else {
        // 用户文档
        entity = new ItbDocumentModel({
            doc_id:doc_id,
            del_flg:0
        });
    }
    entity.findFromDB(function (error, items) {
        items = items || [];

        if(error){
            console.log('home.js [getTmplPreview] find doc error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // 未检索到文档返回[]
        if(items.length==0){
            console.log('home.js [getTmplPreview] doc not found');
            return ret_func(1,CODE.OPERATION_SUCCESS,[]);

        } else {
            var entity2;
            if (tmpl_flg == 1) {
                // 模版
                entity2 = new ItbTmplPageModel({
                    tmpl_ids: items[0].tmpl_id || doc_id
                });

            } else {
                // 用户文档
                entity2 = new ItbTmplPageModel({
                    tmpl_ids: items[0].base_doc_id || '-1'
                });
            }

            entity2.getPagesInfoByTmplIds(function(error, items){
                if(error){
                    console.log('home.js [getTmplPreview] find tmpl-page error: '+error);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                // process success
                var pageData = [];
                if (items != null && items.length > 0) {
                    for (var i in items){
                        var item = items[i];
                        if (backup_flg == 0) {// 只获取普通页
                            if (Number(item.backup_flg)>0) continue;// 过滤保留页
                        }

                        // 只要有未生成预览图的页面就返回error
                        if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                            return ret_func(0,CODE.PAGE_THUMB_EMPTY);
                        }

                        // 组合page数据
                        var pageItem = {
                            base_doc_id: item.tmpl_id,
                            base_page_id: item.page_id,
                            page_index: item.page_index,
                            image: item.thumb_s
                        };
                        pageData.push(pageItem);
                    }
                }

                return ret_func(1,CODE.OPERATION_SUCCESS,pageData);
            });
        }
    });

}
router.get('/getTmplPreview', getTmplPreview);
router.post('/getTmplPreview', getTmplPreview);


//------------------------------------------------------------------
/* 取得[当前文档]的[模版]的页预览图
 * 用于[用户文档]和[模版文档]分表后的版本,逻辑和接口[getTemplatePreview]类似
 * 如果传入的是[模版id],则返回[模版]的页预览图
 * 如果传入的是[用户文档id],则返回[用户文档]对应的[模版]的页预览图
 *
 * 方式:GET
 * 参数 mobile:1手机/2PC
 * 参数 tmpl_flg: 模版flg,默认为0
 *               等于1时id表示tmpl_id,
 *               等于0时id表示doc_id
 * 参数 id: 用户文档id/模版id
 * 参数 backup: 保留页flg,默认为0
 *             等于1时,取得包括保留页在内的所有页
 *             等于0时,只取得普通页
 *
 * 返回值:
 * */
function getTmplPreview2(req, res, next) {

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var tmpl_flg = Number(req.body.tmpl_flg || req.query.tmpl_flg || "0");
    var doc_id = req.body.id || req.query.id;
    var backup_flg = Number(req.body.backup || req.query.backup || "0");

    homeUtil.getDocByDocId(tmpl_flg, doc_id,function(error,doc_item){
        if(error || doc_item==null){
            return homeUtil.ret_func_json(0,CODE.OPERATION_FAILED,{},res);
        }
        homeUtil.getUserInfo(doc_item.user_id, function(error, user_item){
            if(error || user_item==null){
                return homeUtil.ret_func_json(0,CODE.OPERATION_FAILED,{},res);
            }

            homeUtil.getPagesByDoc(tmpl_flg, doc_item, backup_flg,function (error, pages) {
                if(error){
                    return homeUtil.ret_func_json(0,CODE.OPERATION_FAILED,{},res);
                }
                var ret = {
                    "preview":pages,
                    "title":doc_item.tmpl_name|| doc_item.doc_name,
                    "designer":{
                        "id":user_item.user_id,
                        "avatarUrl":user_item.head_url
                    },
                    "create_time":doc_item.create_time
                };
                return homeUtil.ret_func_json(1,CODE.OPERATION_SUCCESS, ret, res);
            })
        });
    });


}
router.get('/getTmplPreview2', getTmplPreview2);
router.post('/getTmplPreview2', getTmplPreview2);


//------------------------------------------------------------------


//------------------------------------------------------------------
/* 获取模版文档的所有页.
 * 方式:GET
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:base_doc_id:模版文档的id
 * 参数:[可选]base_page_id:模版文档页的id
 * 参数:[可选]backup:保留页flg，为空或等于0时仅获取普通页，大于0时获取普通页＋保留页
 *
 * 返回值: data.max_id暂时无效，默认为0
 * */
function getTemplatePageContent(req, res, next) {
/*    var obj = {
        success:1,msg:'success',
        data: {
            base_doc_id:122,
            ver:1,//
            max_id:123,
            pages:[
                // 页面一
                {
                base_page_id:1,
                thumb: BASE_IP + '/images/page01.png',  // 某一页的缩略图
                page_index:0,
                content:[
                    // 标题组
                    {
                        kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                        min:1,          // 最小个数
                        max:2,         // 最大个数
                        id:1,           // 组对象的id
                        value:[         // 数组
                            {
                                // 标题
                                type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                // kind为 2textGroup  时，20表示普通文字组
                                // kind为 3imageGroup 时，30表示普通图片组
                                // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                // kind为 5tableGroup 时，50表示普通表格
                                // kind为 6imageTextGroup 时，70表示普通图文组

                                id: 5,
                                value: "xxxx",   //  文字内容
                                // 标题文字独有属性
                                min: 0,          // 最小字数
                                max: 30,         // 最大字数
                            },
                            {
                                // 副标题
                                type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                // kind为 2textGroup  时，20表示普通文字组
                                // kind为 3imageGroup 时，30表示普通图片组
                                // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                // kind为 5tableGroup 时，50表示普通表格
                                // kind为 6imageTextGroup 时，70表示普通图文组

                                id: 5,
                                value: "xxxx",   //  文字内容
                                // 标题文字独有属性
                                min: 0,          // 最小字数
                                max: 30,         // 最大字数
                            },
                        ],
                    },
                    // 文字组
                    {
                        kind:2,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                        min:1,          // 最小个数
                        max:2,         // 最大个数
                        id:1,           // 组对象的id
                        value:[         // 数组
                            {
                                // 文字
                                type: 20,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                // kind为 2textGroup  时，20表示普通文字组
                                // kind为 3imageGroup 时，30表示普通图片组
                                // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                // kind为 5tableGroup 时，50表示普通表格
                                // kind为 6imageTextGroup 时，70表示普通图文组
                                id: 5,
                                value: "xxxx",   //  文字内容
                                // 文字独有属性
                                min: 0,          // 最小字数
                                max: 30,         // 最大字数
                            },
                        ],
                    }
                ]
                },
                // 页面二
                {
                    base_page_id:1,
                    thumb: BASE_IP + '/images/page02.png',  // 某一页的缩略图
                    page_index:1,
                    content:[
                        // 标题组
                        {
                            kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 标题
                                    type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                                {
                                    // 副标题
                                    type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        // 图片组
                        {
                            kind:3,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 图片
                                    type: 30,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,
                                    value: "xxxx",   //  图片地址
                                    mask:{"paths":[{"points":[[27.00,13.50,8],[19.50,13.50,1],[19.50,6.00,1],[13.50,6.00,1],[27.00,33.00,9]],"w":0.00,"h":0.00}],"w":30.00,"h":30.00,"x":0.00,"y":0.00}
                                },
                            ],
                        }
                    ],
                    img_mask:[    // 本页所有图片组的mask (Added 2016-05-06) TODO
                        {id: 100, mask:{...}},
                        ...
                    ]
                },
                // 页面三
                {
                    base_page_id:1,
                    thumb: BASE_IP + '/images/page03.png',  // 某一页的缩略图
                    page_index:2,
                    content:[
                        // 标题组
                        {
                            kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 标题
                                    type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                                {
                                    // 副标题
                                    type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        // 图表组
                        {
                            kind:4,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 图表
                                    type: 40,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,

                                    thumb:"",// 图表的缩略图，ios端生成，暂时预留

                                    // 独有属性
                                    name:"销售额",
                                    xName:"年",
                                    yname:"万元",
                                    color:{"r":100,"g":120,"b":30},//TODO 折线、柱子、饼的色系
                                    curve:{   // 刻度线，当type为40折线图时有效
                                        x:["2000","2005","2010","2015"],
                                        y:["100","110","120","130","140"],
                                    },
                                    dataGroups:[
                                        {
                                            x:["2003","2008","2011"],
                                            y:["100","125","140"],
                                            color:[{"r":10,"g":20,"b":30}],//TODO 颜色
                                        },
                                    ],

                                },
                                {
                                    // 图表
                                    type: 41,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,

                                    thumb:"",// 图表的缩略图，ios端生成，暂时预留

                                    // 独有属性
                                    name:"销售额",
                                    xName:"年",
                                    yname:"万元",
                                    color:{"r":100,"g":120,"b":30},//TODO 折线、柱子、饼的色系
                                    curve:{   // 刻度线，当type为40折线图时有效
                                        x:["2000","2005","2010","2015"],
                                        y:["100","110","120","130","140"],
                                    },
                                    dataGroups:[
                                        {
                                            x:["2003","2008","2011"],
                                            y:["100","125","140"],
                                            color:[{"r":10,"g":20,"b":30}],//TODO 颜色
                                        },
                                    ],
                                },
                                {
                                    // 图表
                                    type: 42,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,

                                    thumb:"",// 图表的缩略图，ios端生成，暂时预留

                                    // 独有属性
                                    name:"销售额",
                                    xName:"年",
                                    yname:"万元",
                                    color:{"r":100,"g":120,"b":30},//TODO 折线、柱子、饼的色系
                                    curve:{   // 刻度线，当type为40折线图时有效
                                        x:["2000","2005","2010","2015"],
                                        y:["100","110","120","130","140"],
                                    },
                                    dataGroups:[
                                        {
                                            x:["2003","2008","2011"],
                                            y:["100","125","140"],
                                            color:[{"r":10,"g":20,"b":30},{"r":10,"g":120,"b":30},{"r":0,"g":120,"b":30}],//TODO 颜色
                                        },
                                    ],
                                },

                            ],
                        }
                    ]
                },
                // 页面四
                {
                    base_page_id:1,
                    thumb: BASE_IP + '/images/page04.png',  // 某一页的缩略图
                    page_index:3,
                    content:[
                        // 标题组
                        {
                            kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 标题
                                    type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                                {
                                    // 副标题
                                    type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        //表格组
                        {
                            kind:5,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:1,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 表格
                                    type: 50,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,
                                    // 独有属性
                                    row:2,// 2行
                                    col:3,// 3列
                                    cell:[ // 格子当值
                                        ["1","2","3"],
                                        ["4","5","6"],
                                    ],

                                },
                            ],
                        }
                    ]
                },
                // 页面五
                {
                    base_page_id:1,
                    thumb: BASE_IP + '/images/page05.png',  // 某一页的缩略图
                    page_index:4,
                    content:[
                        // 标题组
                        {
                            kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 标题
                                    type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                                {
                                    // 副标题
                                    type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        // 图文组
                        {
                            kind:6,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:3,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 图文
                                    type: 60,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 6,
                                    image:{
                                        type:30,            // 图片
                                        id:8,               // image id
                                        value:"http://xxxxx",   //  图片地址
                                        mask:{"paths":[{"points":[[27.00,13.50,8],[19.50,13.50,1],[19.50,6.00,1],[13.50,6.00,1],[27.00,33.00,9]],"w":0.00,"h":0.00}],"w":30.00,"h":30.00,"x":0.00,"y":0.00},
                                    },
                                    text:{
                                        type:20,        // 普通文字组
                                        min:0,          // 最小字数
                                        max:30,         // 最大字数
                                        id:9,           // text id
                                        value:"xxxx",   //  文字内容
                                    },
                                }
                            ],
                        }
                    ]
                },
                // 页面六
                {
                    base_page_id:1,
                    thumb: BASE_IP + '/images/page06.png',  // 某一页的缩略图
                    page_index:5,
                    content:[
                        // 标题组
                        {
                            kind:1,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 标题
                                    type: 10,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                                {
                                    // 副标题
                                    type: 11,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组

                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 标题文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        // 文字组
                        {
                            kind:2,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 文字
                                    type: 20,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,
                                    value: "xxxx",   //  文字内容
                                    // 文字独有属性
                                    min: 0,          // 最小字数
                                    max: 30,         // 最大字数
                                },
                            ],
                        },
                        // 图片组
                        {
                            kind:3,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:2,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 图片
                                    type: 30,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,
                                    value: "xxxx",   //  图片地址
                                    mask:{"paths":[{"points":[[27.00,13.50,8],[19.50,13.50,1],[19.50,6.00,1],[13.50,6.00,1],[27.00,33.00,9]],"w":0.00,"h":0.00}],"w":30.00,"h":30.00,"x":0.00,"y":0.00},
                                },
                            ],
                        },
                        // 表格组
                        {
                            kind:5,// 1titleGroup/2textGroup/3imageGroup/4graphGroup/5tableGroup/6imageTextGroup/
                            min:1,          // 最小个数
                            max:1,         // 最大个数
                            id:1,           // 组对象的id
                            value:[         // 数组
                                {
                                    // 表格
                                    type: 50,// kind为 1titleGroup 时，10表示标题/11表示子标题；
                                    // kind为 2textGroup  时，20表示普通文字组
                                    // kind为 3imageGroup 时，30表示普通图片组
                                    // kind为 4graphGroup 时，40折线图／41柱状图／42饼状图
                                    // kind为 5tableGroup 时，50表示普通表格
                                    // kind为 6imageTextGroup 时，70表示普通图文组
                                    id: 5,
                                    // 独有属性
                                    row:2,// 2行
                                    col:3,// 3列
                                    cell:[ // 格子当值
                                        ["1","2","3"],
                                        ["4","5","6"],
                                    ],

                                },
                            ],
                        }
                    ]
                }
            ]
        }
    };
    res.set('Content-Type', 'application/json');
    res.json(obj);*/

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var doc_id = req.body.base_doc_id || req.query.base_doc_id;
    var page_id = req.body.base_page_id || req.query.base_page_id;
    var backup_flg = Number(req.body.backup || req.query.backup || "0");

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    // 检索document
    var entity = new ItbDocumentModel({
        doc_id: doc_id,
        del_flg: 0
    });
    entity.findFromDB(function (error, items) {
        items = items||[];

        if(error){
            console.log('home.js [getTemplatePageContent] find doc error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // 未检索到document返回{}
        if(items.length==0){
            console.log('home.js [getTemplatePageContent] doc not found');
            return ret_func(1,CODE.OPERATION_SUCCESS,{});

        }else{
            // 检索到document时
            var docId = items[0].doc_id;
            var ver = items[0].ver;
            var entity2;
            if (page_id != null && page_id.length > 0) {
                // 指定了pageId时
                entity2 = new ItbPageModel({
                    doc_id:docId,
                    page_id:page_id,
                    del_flg:0,
                });
            } else {
                // 未指定pageId时
                entity2 = new ItbPageModel({
                    doc_id:docId,
                    del_flg:0,
                });
            }

            // 检索pages
            entity2.getPageInfoAndTmplRep(function (error2, items2) {
                items2 = items2||[];
                items2.sort(function(a,b){
                    return a.page_index-b.page_index
                });

                // 组织pages数据
                var pagesData=[];
                for (var i in items2) {
                    var pageItem = items2[i];
                    if (backup_flg == 0) {// 只获取普通页
                        if (Number(pageItem.backup_flg)>0) continue;
                    }

                    var strJsonRep = (pageItem.replaces || '[]').replace(/\n/g,'\\n');// page的replaces,处理Text对象的换行符

                    var imgMask = [];
                    var strTmplRep = '[]';
                    if (pageItem.tmpl_page_id ) {
                        strTmplRep = (pageItem.tmpl_replaces || '[]').replace(/\n/g,'\\n');// 模版的replaces
                    } else {
                        strTmplRep = strJsonRep;
                    }
                    var jsonTmplRep = JSON.parse(strTmplRep);
                    if (jsonTmplRep && jsonTmplRep.length > 0) {
                        for (var n in jsonTmplRep) {// 解析replaces
                            var repGrp = jsonTmplRep[n];
                            for (var k in repGrp.value){
                                var repItem = repGrp.value[k];
                                // CLASS_TYPE_SJGReplaceItemImage
                                if (repItem.ct == 805) {
                                    var tmpData = {
                                        id: repItem.id,
                                        mask: repItem.mask || {},
                                    };
                                    imgMask.push(tmpData);

                                // CLASS_TYPE_SJGReplaceItemImageText / CLASS_TYPE_SJGReplaceItemImageText2
                                } else if (repItem.ct == 806 || repItem.ct == 812) {
                                    var tmpData = {
                                        id: repItem.image.id,
                                        mask: repItem.image.mask || {},
                                    };
                                    imgMask.push(tmpData);
                                }
                            }
                        }
                    }

                    var pageData = {
                        base_page_id: pageItem.page_id,
                        thumb: pageItem.thumb_s || pageItem.tmpl_thumb || '',
                        page_index: pageItem.page_index,
                        content: JSON.parse(strJsonRep),
                        img_mask: imgMask, // Added 2016-05-06
                    };
                    pagesData.push(pageData);
                }

                // 组织data数据
                var retData = {
                    base_doc_id:docId,
                    ver:ver,
                    max_id:0,// TODO
                    pages:pagesData
                };

                return ret_func(1,CODE.OPERATION_SUCCESS,retData);
            });
        }
    });

}
router.get('/getTemplatePageContent', getTemplatePageContent);
router.post('/getTemplatePageContent', getTemplatePageContent);

//------------------------------------------------------------------
/* 获取文档页信息.
 * 用于[用户文档]和[模版文档]分表后的版本,逻辑与接口[getTemplatePageContent]类似
 *
 * 方式:GET/POST
 * 参数 pc: 1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数 tmpl_flg: 模版flg,默认为0
 *               等于1时,下列id为[模版文档]相关id,主要检索[itb_template]/[itb_tmpl_page]表
 *               等于0时,下列id为[用户文档]相关id,主要检索[itb_document]/[itb_page]表
 * 参数 doc_id: 用户文档的doc_id/模版文档的tmpl_id
 * 参数 [可选]page_id: 用户文档页/模版文档页的page_id
 * 参数 [可选]backup: 保留页flg,默认为0
 *                   等于0时仅获取普通页
 *                   等于1时获取普通页＋保留页
 *
 * 返回值:
        success: 1,
        msg: 'success',
        data: {
            doc_id: 122,
            doc_name: 'xxx',// 用户文档名
            ver: 1,
            max_id: 0,// 暂时无效，默认为0
            pages:[
                {
                // 用户文档时page_id表示页id／base_page_id表示模版页id
                // 模版文档时page_id表示模版页id／base_page_id为空
                page_id: 1,
                base_page_id: 2,
                thumb: BASE_IP + '/images/page01.png',
                page_index: 0,
                content: []
                }
            ]
        }
 * */
function getPageContent(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var tmpl_flg = Number(req.body.tmpl_flg || req.query.tmpl_flg || "0");
    var doc_id = req.body.doc_id || req.query.doc_id;
    var page_id = req.body.page_id || req.query.page_id;
    var backup_flg = Number(req.body.backup || req.query.backup || "0");

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    function proc_func(pageItems, base_doc_id, doc_name, ver) {

        pageItems = pageItems||[];
        pageItems.sort(function(a,b){
            return a.page_index-b.page_index
        });

        // 组织pages数据
        var pagesData=[];
        for (var i in pageItems) {
            var pageItem = pageItems[i];
            if (backup_flg == 0) {// 只获取普通页
                if (Number(pageItem.backup_flg)>0) continue;// 跳过保留页
            }

            var strJsonRep = (pageItem.replaces || '[]').replace(/\n/g,'\\n');// page的replaces,处理Text对象的换行符

            var imgMask = [];
            var strTmplRep = '[]';
            if (pageItem.tmpl_page_id ) {
                // 用户文档
                strTmplRep = (pageItem.tmpl_replaces || '[]').replace(/\n/g,'\\n');// 模版的replaces
            } else {
                // 模版本身
                strTmplRep = strJsonRep;
            }
            var jsonTmplRep = JSON.parse(strTmplRep);
            if (jsonTmplRep && jsonTmplRep.length > 0) {
                for (var n in jsonTmplRep) {// 解析replaces
                    var repGrp = jsonTmplRep[n];
                    for (var k in repGrp.value){
                        var repItem = repGrp.value[k];
                        // CLASS_TYPE_SJGReplaceItemImage
                        if (repItem.ct == 805) {
                            var tmpData = {
                                id: repItem.id,
                                mask: repItem.mask || {},
                            };
                            imgMask.push(tmpData);

                            // CLASS_TYPE_SJGReplaceItemImageText / CLASS_TYPE_SJGReplaceItemImageText2
                        } else if (repItem.ct == 806 || repItem.ct == 812) {
                            var tmpData = {
                                id: repItem.image.id,
                                mask: repItem.image.mask || {},
                            };
                            imgMask.push(tmpData);
                        }
                    }
                }
            }

            var tmplPageId = '';
            if (tmpl_flg == 0) {
                tmplPageId = pageItem.base_page_id;
            }

            var pageData = {
                page_id: pageItem.page_id,
                base_page_id: tmplPageId,
                thumb: pageItem.thumb_s || '',
                page_index: pageItem.page_index,
                content: JSON.parse(strJsonRep) || '',
                img_mask: imgMask, // Added 2016-05-06
            };
            pagesData.push(pageData);
        }

        // 组织data数据
        var retData = {
            doc_id:doc_id,
            doc_name: (tmpl_flg == 0) ? (doc_name || '') : '',
            base_doc_id:base_doc_id,
            ver:ver,
            max_id:0,// TODO
            pages:pagesData
        };

        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    }

    // 检索document
    var entity;
    if (tmpl_flg == 1) {
        // 模版
        entity = new ItbTemplateModel({
            tmpl_id: doc_id,
            del_flg: 0
        });
    } else {
        // 用户文档
        entity = new ItbDocumentModel({
            doc_id: doc_id,
            del_flg: 0
        });
    }
    entity.findFromDB(function (error, items) {
        items = items||[];

        if (error) {
            console.log('home.js [getPageContent] find doc error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // 未检索到文档返回{}
        if (items.length == 0) {
            console.log('home.js [getPageContent] doc not found');
            return ret_func(1,CODE.OPERATION_SUCCESS,{});

        } else {
            // 检索到文档时
            var ver = items[0].ver;
            var base_doc_id = (tmpl_flg == 1)?items[0].base_tmpl_id:items[0].base_doc_id;
            var entity2;
            if (tmpl_flg == 1) {
                // 模版
                if (page_id != null && page_id.length > 0) {
                    // 指定了pageId时
                    entity2 = new ItbTmplPageModel({
                        tmpl_id:doc_id,
                        page_id:page_id,
                        del_flg:0,
                    });
                } else {
                    // 未指定pageId时
                    entity2 = new ItbTmplPageModel({
                        tmpl_id:doc_id,
                        del_flg:0,
                    });
                }
                // 检索pages
                entity2.findFromDB(function (error2, items2) {
                    if (error2) {
                        console.log('home.js [getPageContent] find tmpl-page error: '+error2);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    proc_func(items2, base_doc_id, null, ver);
                });

            } else {
                // 用户文档
                if (page_id != null && page_id.length > 0) {
                    // 指定了pageId时
                    entity2 = new ItbPageModel({
                        doc_id:doc_id,
                        page_id:page_id,
                        del_flg:0,
                    });
                } else {
                    // 未指定pageId时
                    entity2 = new ItbPageModel({
                        doc_id:doc_id,
                        del_flg:0,
                    });
                }
                // 检索pages
                entity2.getPageInfoAndTmplRep(function (error2, items2) {
                    if (error2) {
                        console.log('home.js [getPageContent] find page error: '+error2);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    proc_func(items2, base_doc_id, items[0].doc_name, ver);
                });
            }
        }
    });

}
router.get('/getPageContent', getPageContent);
router.post('/getPageContent', getPageContent);

//------------------------------------------------------------------
/* 移动端用户保存文档.注意：仅仅限制 ios 1.0以上版本 使用此接口
 * 方式:POST
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数: user_id : 用户唯一标识符.可能为空，表示未登陆，需要使用uuid创建一个用户
 * 参数: uuid    : 设备唯一标识符
 * 参数: doc :    移动端文档的json字符串，形式入下：
 *
     {
         base_doc_id:122,// 对应后端的doc_id,到itb_document中查找，如果是模版，则新建用户数据；如果是用户数据，则更新
         max_id:123,
         doc_id:0, // ios端的sqlite的id，服务端不存储
         pages: [
             {
                 template_page_id:2,// 模版页的id,存储到itb_page的base_page_id中
                 thumb: BASE_IP + '/images/page01.png',  // 某一页的缩略图
                 page_index:0,
                 content:[]// 数组格式，具体内容参考 getTemplatePageContent 的返回值中的pages的content
             }
         ]
     }

 保存文档时的其他参数:
 doc_name: 暂时按日期时间命名
 doc_ver: 和base模版的doc_ver一致
 publish: 默认0，不公开
 * */
function saveUserDoc2(req, res, next) {

}
router.get('/saveUserDoc2', saveUserDoc2);
router.post('/saveUserDoc2', saveUserDoc2);

//------------------------------------------------------------------
/* 移动端用户保存文档.注意：仅仅限制 ios 1.0 使用此接口
 * 方式:POST
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数: user_id : 用户唯一标识符.可能为空，表示未登陆，需要使用uuid创建一个用户
 * 参数: uuid    : 设备唯一标识符
 * 参数: doc :    移动端文档的json字符串，形式入下：
 *
    {
         base_doc_id:122,// 对应后端的doc_id,到itb_document中查找，如果是模版，则新建用户数据；如果是用户数据，则更新
         max_id:123,
         doc_id:0, // ios端的sqlite的id，服务端不存储
         pages: [
             {
                 base_page_id:1,// ios 1.0中此字段的含义，新建用户文档时是模版页的id，更新用户文档时是上一个用户文档的页的id
                 // 需要根据他获取模版页的id存储到itb_page的base_page_id中
                 thumb: BASE_IP + '/images/page01.png',  // 某一页的缩略图
                 page_index:0,
                 dirty:0,// 1表示发生过更改
                 content:[]// 数组格式，具体内容参考 getTemplatePageContent 的返回值中的pages的content
             }
         ]
    }

    保存文档时的其他参数:
    doc_name: 暂时按日期时间命名
    doc_ver: 和base模版的doc_ver一致
    publish: 默认0，不公开
 * */
function saveUserDoc(req, res, next) {
    //console.log(req.body.doc);//POST
    //console.log(req.query.key);//GET
    //var obj = {
    //    success:1,msg:'success',
    //    data:{
    //        user_id:18,// 用户id，如果输入参数user_id为空，会创建临时用户id
    //        base_doc_id:123,// 保存后新doc的id，用于移动端更新sqlite表的base_doc_id
    //        pages: [111, 222, 333, 444, 555, 666]       // 保存后新page 的 id, 用于移动端更新 sqlite 表的 base_page_id;
    //    }
    //};
    //res.set('Content-Type', 'application/json');
    //res.json(obj);

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var docStr = req.body.doc || req.query.doc;
    var doc = JSON.parse(docStr);
    var user_id = req.body.user_id || req.query.user_id || "";
    var uuid = req.body.uuid || req.query.uuid;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof uuid=='undefined' || uuid == null || uuid.trim().length == 0){
        return ret_func(0,CODE.UUID_EMPTY);
    }
    if(typeof doc=='undefined' || doc == null){
        return ret_func(0,CODE.DOC_DATA_EMPTY);
    }

    /* 根据ios端传递端base_doc_id查找模版页的id
     * @param pages:[{
     *          base_page_id: 1,
     *          thumb: BASE_IP + '/images/page01.png',
     *          page_index: 0,
     *          content: []
     *       }]
     */
    function fixBugOfBasePageId(pages, callback){
        ItbPageModel.prototype.replateTemplatePageIdToUserPage(callback,pages);
    }

    // proc
    async.parallel({
        getDoc: function(callback){
            var entityDoc = new ItbDocumentModel({
                doc_id:doc.base_doc_id,
                del_flg:0
            });
            entityDoc.findFromDB(function(err, items) {
                if (err) {
                    console.log('home.js [saveUserDoc] check doc_id error: ' + err);
                    return callback(err, null);
                }

                if (items != null && items.length > 0) {
                    callback(null, items[0]);

                } else {
                    console.log('home.js [saveUserDoc] doc_id not exist ');
                    callback(CODE.DOC_ID_INVAILD, null);
                }
             });
        },

        getUserId: function(callback){
            // 检索user
            var entity = new ItbUserModel({
                //uuid    : uuid,
                user_id : user_id,
                del_flg : 0
            });
            entity.findFromDB(function(error, items){
                if (error){
                    console.log('home.js [saveUserDoc] select user error: '+error);
                    return callback(error, null);
                }

                if (items != null && items.length > 0) {
                    callback(null, items[0].user_id);

                } else {
                    // 创建临时user
                    var entity2 = new ItbUserModel({
                        password  : 'e10adc3949ba59abbe56e057f20f883e',// 123456
                        uuid      : uuid,
                        user_type : 1,
                    });
                    entity2.saveToDB(function(err, newUserId){
                        if(err){
                            console.log('home.js [saveUserDoc] create user error: '+err);
                            return callback(error, null);
                        }

                        callback(error, newUserId);
                    });
                }
            });
        }

    }, function(error, result){
        if (error) {
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        var userId = result.getUserId;
        var docItem = result.getDoc;
        var docName = '新建文档';
        //var replaces = [];
        //for (var i in doc.pages){
        //    replaces.push(JSON.stringify(doc.pages[i]));
        //}

        if (0 == docItem.user_type) {// 模版数据
            // 新规
            var newDocEntity = new ItbDocumentModel({
                base_doc_id: docItem.doc_id,
                doc_name: docName,
                user_id: userId,
                user_type: 1,
                publish: 0,
                ver:docItem.ver
            });
            // insert document
            newDocEntity.saveToDB(function(err, newDocId){
                if (err) {
                    console.log('home.js [saveUserDoc] insert doc error: '+err);
                    return ret_func(0,CODE.CREATE_DOC_ERROR);
                }

                // 新建pages
                var pageEntity = new ItbPageModel({
                    doc_id: newDocId,
                    update_by: userId// TODO
                });
                pageEntity.savePages(function(err3,result){
                    if (err3) {
                        console.log('home.js [saveUserDoc] insert pages error: '+err3);
                        return ret_func(0,CODE.CREATE_PAGE_ERROR);
                    }

                    var pages = result || [];
                    var retData = {
                        user_id: userId,
                        base_doc_id: newDocId,
                        pages: pages
                    }

                    // TODO 排版生成预览图
                    rpcFunc.typesetDoc(newDocId, function (ret) {
                        // TODO
                    });

                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                },newDocId,1,userId,doc.pages);
            });

        } else {// 用户数据
            // 更新
            var updDocEntity = new ItbDocumentModel({
                doc_id: docItem.doc_id,// Key
                doc_name: docName,
                user_id: userId
            });
            updDocEntity.updateToDB(function(err){
                if (err) {
                    console.log('home.js [saveUserDoc] update doc error: '+err);
                    return ret_func(0,CODE.UPDATE_DOC_ERROR);
                }

                // 根据ios端传递端base_doc_id查找模版页的id
                fixBugOfBasePageId(doc.pages, function(){
                    // 删除pages
                    var pageEntity = new ItbPageModel({
                        doc_id: docItem.doc_id,
                        update_by: userId// TODO
                    });
                    pageEntity.deletePagesByDocIdLogic(function(err2){
                        if (err2) {
                            console.log('home.js [saveUserDoc] delete pages error: '+err2);
                            return ret_func(0,CODE.DELETE_PAGE_ERROR);
                        }

                        // 新建pages
                        pageEntity.savePages(function(err3,result){
                            if (err3) {
                                console.log('home.js [saveUserDoc] insert pages error: '+err3);
                                return ret_func(0,CODE.CREATE_PAGE_ERROR);
                            }

                            var pages = result || [];
                            var retData = {
                                user_id: userId,
                                base_doc_id: docItem.doc_id,
                                pages: pages
                            }

                            // TODO 排版生成预览图
                            rpcFunc.typesetDoc(docItem.doc_id, function (ret) {
                                // TODO
                            });

                            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                        },docItem.doc_id,1,userId,doc.pages);

                    });
                });
            });
        }
    });

}

router.get('/saveUserDoc', saveUserDoc);
router.post('/saveUserDoc', saveUserDoc);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 移动端－仅仅保存用户文档，不排版.  注意：仅仅限制 ios 1.0 使用此接口
 * 方式:POST
 * 参数:同saveUserDoc的参数
 * */
function saveUserDocOnly(req, res, next) {
    //console.log(req.body.doc);//POST
    //console.log(req.query.key);//GET
    //var obj = {
    //    success:1,msg:'success',
    //    data:{
    //        user_id:18,// 用户id，如果输入参数user_id为空，会创建临时用户id
    //        base_doc_id:123,// 保存后新doc的id，用于移动端更新sqlite表的base_doc_id
    //        pages: [111, 222, 333, 444, 555, 666]       // 保存后新page 的 id, 用于移动端更新 sqlite 表的 base_page_id;
    //    }
    //};
    //res.set('Content-Type', 'application/json');
    //res.json(obj);

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var docStr = req.body.doc || req.query.doc;
    var doc = JSON.parse(docStr);
    var user_id = req.body.user_id || req.query.user_id || "";
    var uuid = req.body.uuid || req.query.uuid;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof uuid=='undefined' || uuid == null || uuid.trim().length == 0){
        return ret_func(0,CODE.UUID_EMPTY);
    }
    if(typeof doc=='undefined' || doc == null){
        return ret_func(0,CODE.DOC_DATA_EMPTY);
    }

    /* 根据ios端传递端base_doc_id查找模版页的id
     * @param pages:[{
     *          base_page_id: 1,
     *          thumb: BASE_IP + '/images/page01.png',
     *          page_index: 0,
     *          content: []
     *       }]
     */
    function fixBugOfBasePageId(pages, callback){
        ItbPageModel.prototype.replateTemplatePageIdToUserPage(callback,pages);
    }

    // proc
    async.parallel({
        getDoc: function(callback){
            var entityDoc = new ItbDocumentModel({
                doc_id:doc.base_doc_id,
                del_flg:0
            });
            entityDoc.findFromDB(function(err, items) {
                if (err) {
                    console.log('home.js [saveUserDoc] check doc_id error: ' + err);
                    return callback(err, null);
                }

                if (items != null && items.length > 0) {
                    callback(null, items[0]);

                } else {
                    console.log('home.js [saveUserDoc] doc_id not exist ');
                    callback(CODE.DOC_ID_INVAILD, null);
                }
            });
        },

        getUserId: function(callback){
            // 检索user
            var entity;
            if (user_id == "" || user_id == null) {
                // user_id为空时用uuid检索
                entity = new ItbUserModel({
                    uuid    : uuid,
                    del_flg : 0
                });
            } else {
                // user_id不为空时用user_id检索
                entity = new ItbUserModel({
                    user_id : user_id,
                    del_flg : 0
                });
            }
            entity.findFromDB(function(error, items){
                if (error){
                    console.log('home.js [saveUserDoc] select user error: '+error);
                    return callback(error, null);
                }

                if (items != null && items.length > 0) {
                    callback(null, items[0].user_id);

                } else {
                    // 创建临时user
                    var entity2 = new ItbUserModel({
                        password  : 'e10adc3949ba59abbe56e057f20f883e',// 123456
                        uuid      : uuid,
                        user_type : 1,
                    });
                    entity2.saveToDB(function(err, newUserId){
                        if(err){
                            console.log('home.js [saveUserDoc] create user error: '+err);
                            return callback(error, null);
                        }

                        callback(error, newUserId);
                    });
                }
            });
        }

    }, function(error, result){
        if (error) {
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        var userId = result.getUserId;
        var docItem = result.getDoc;
        var docName = '新建文档';
        //var replaces = [];
        //for (var i in doc.pages){
        //    replaces.push(JSON.stringify(doc.pages[i]));
        //}

        if (0 == docItem.user_type) {// 模版数据
            // 新规
            var newDocEntity = new ItbDocumentModel({
                base_doc_id: docItem.doc_id,
                doc_name: docName,
                user_id: userId,
                user_type: 1,
                publish: 0,
                ver:docItem.ver
            });
            // insert document
            newDocEntity.saveToDB(function(err, newDocId){
                if (err) {
                    console.log('home.js [saveUserDoc] insert doc error: '+err);
                    return ret_func(0,CODE.CREATE_DOC_ERROR);
                }

                // 新建pages
                var pageEntity = new ItbPageModel({
                    doc_id: newDocId,
                    update_by: userId// TODO
                });
                pageEntity.savePages(function(err3,result){
                    if (err3) {
                        console.log('home.js [saveUserDoc] insert pages error: '+err3);
                        return ret_func(0,CODE.CREATE_PAGE_ERROR);
                    }

                    var pages = result || [];
                    var retData = {
                        user_id: userId,
                        base_doc_id: newDocId,
                        pages: pages
                    }

                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                },newDocId,1,userId,doc.pages);
            });

        } else {// 用户数据
            // 更新
            var updDocEntity = new ItbDocumentModel({
                doc_id: docItem.doc_id,// Key
                doc_name: docName,
                user_id: userId
            });
            updDocEntity.updateToDB(function(err){
                if (err) {
                    console.log('home.js [saveUserDoc] update doc error: '+err);
                    return ret_func(0,CODE.UPDATE_DOC_ERROR);
                }

                // 根据ios端传递端base_doc_id查找模版页的id
                fixBugOfBasePageId(doc.pages, function(){
                    // 删除pages
                    var pageEntity = new ItbPageModel({
                        doc_id: docItem.doc_id,
                        update_by: userId// TODO
                    });
                    pageEntity.deletePagesByDocIdLogic(function(err2){
                        if (err2) {
                            console.log('home.js [saveUserDoc] delete pages error: '+err2);
                            return ret_func(0,CODE.DELETE_PAGE_ERROR);
                        }

                        // 新建pages
                        pageEntity.savePages(function(err3,result){
                            if (err3) {
                                console.log('home.js [saveUserDoc] insert pages error: '+err3);
                                return ret_func(0,CODE.CREATE_PAGE_ERROR);
                            }

                            var pages = result || [];
                            var retData = {
                                user_id: userId,
                                base_doc_id: docItem.doc_id,
                                pages: pages
                            }

                            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                        },docItem.doc_id,1,userId,doc.pages);

                    });
                });
            });
        }
    });

}

router.get('/saveUserDocOnly', saveUserDocOnly);
router.post('/saveUserDocOnly', saveUserDocOnly);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 移动端－仅仅保存用户文档,不排版.
 * 用于[用户文档]和[模版文档]分表后的版本,逻辑和接口[saveUserDocOnly]类似(删除创建临时user逻辑)
 *
 * 方式:POST
 * 参数 tmpl_flg: 模版flg,默认为0
 *               等于1时,主要检索[itb_template]/[itb_tmpl_page]表, doc_id传空或0
 *               等于0时,主要检索[itb_document]/[itb_page]表, doc_id/tmpl_id均不为空
 * 参数 user_id: 用户id.不能为空!
 * 参数 uuid: 设备唯一标识符
 * 参数 clrHis[可选]: 是否删除切换模版历史记录(等于1时删除,默认不删除)
 * 参数 doc: 移动端文档的json字符串,形式入下:
 {
     doc_id:1000,// 用户文档id
     doc_name: xxxx,
     tmpl_id: 100,// 模版id
     max_id:123,
     pages: [
         {
         page_id: 1001,// 用户文档页id（新建时,传空或0）
         base_page_id: 1000,// 模版页id
         thumb: BASE_IP + '/images/page01.png',
         page_index: 0,
         dirty: 0,// 1表示发生过更改
         content:[]// 数组格式,具体内容参考 getTemplatePageContent 的返回值中的pages的content
         }
     ]
 }
 * */
function saveUserDocOnly2(req, res, next) {
    //var obj = {
    //    success:1, msg:'success',
    //    data:{
    //        user_id: 18, // 用户id
    //        doc_id: 123, // 保存后新doc的id
    //        pages: [111, 222, 333, 444, 555, 666] // 保存后新page的id
    //    }
    //};

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var docStr = req.body.doc || req.query.doc;
    var doc = JSON.parse(docStr);
    var user_id = req.body.user_id || req.query.user_id || "";
    var uuid = req.body.uuid || req.query.uuid;
    var tmpl_flg = Number(req.body.tmpl_flg || req.query.tmpl_flg || "0");
    var clrHis = Number(req.body.clrHis || req.query.clrHis || "0");
    if(CONFIG.DEBUG==1) clrHis = 0;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof uuid=='undefined' || uuid == null || uuid.trim().length == 0){
        return ret_func(0,CODE.UUID_EMPTY);
    }
    if(typeof doc=='undefined' || doc == null){
        return ret_func(0,CODE.DOC_DATA_EMPTY);
    }

    // proc
    async.parallel({
        getDoc: function(callback){
            var entityDoc;
            if (tmpl_flg == 1) {
                // 通过模版新建的场合
                entityDoc = new ItbTemplateModel({
                    tmpl_id:doc.tmpl_id,
                    del_flg:0
                });

            } else {
                // 用户文档的场合
                entityDoc = new ItbDocumentModel({
                    doc_id:doc.doc_id,
                    del_flg:0
                });
            }
            entityDoc.findFromDB(function(err, items) {
                if (err) {
                    console.log('home.js [saveUserDocOnly2] check doc_id error: ' + err);
                    return callback(err, null);
                }

                if (items != null && items.length > 0) {
                    return callback(null, items[0]);

                } else {
                    console.log('home.js [saveUserDocOnly2] doc_id not exist ');
                    return callback(CODE.DOC_ID_INVAILD, null);
                }
            });
        },

        getUserId: function(callback){
            // 检索user
            var entity = new ItbUserModel({
                //uuid    : uuid,
                user_id : user_id,
                del_flg : 0
            });
            entity.findFromDB(function(error, items){
                if (error){
                    console.log('home.js [saveUserDocOnly2] select user error: '+error);
                    return callback(error, null);
                }

                if (items != null && items.length > 0) {
                    return callback(null, items[0].user_id);

                } else {
                    console.log('home.js [saveUserDocOnly2] user not exist ');
                    return callback(CODE.USER_ID_INVAILD, null);
                }
            });
        }

    }, function(error, result){
        if (error) {
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        var userId = result.getUserId;
        var docItem = result.getDoc;

        if (1 == tmpl_flg) {// 模版数据
            // 新规
            var newDocEntity = new ItbDocumentModel({
                base_doc_id: docItem.tmpl_id,
                doc_name: doc.doc_name||'新文档',
                user_id: userId,
                user_type: 1,
                publish: 0,
                ver:docItem.ver,
                update_by: userId,
            });
            // insert document
            newDocEntity.saveToDB(function(err, newDocId){
                if (err) {
                    console.log('home.js [saveUserDocOnly2] insert doc error: '+err);
                    return ret_func(0,CODE.CREATE_DOC_ERROR);
                }

                // 新建pages
                var pageEntity = new ItbPageModel({
                    doc_id: newDocId,
                    update_by: userId// TODO
                });
                pageEntity.updatePages(function(err3,result){
                    if (err3) {
                        console.log('home.js [saveUserDocOnly2] insert pages error: '+err3);
                        return ret_func(0,CODE.CREATE_PAGE_ERROR);
                    }

                    var pageIds = result || [];// 已按page_index排序
                    var retData = {
                        user_id: userId,
                        doc_id: newDocId,
                        doc_name: doc.doc_name||'新文档',
                        pages: pageIds
                    };

                    if(1==clrHis){
                        doClrHis(newDocId, function(err4, ret4){
                            if (err4) {
                                console.log('home.js [saveUserDocOnly2] clrHis error: '+err4);
                                return ret_func(0,CODE.OPERATION_FAILED);
                            }
                            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                        });
                    } else {
                        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                    }

                },newDocId,1,userId,doc.pages);
            });

        } else {// 用户数据
            // 更新
            var updDocEntity = new ItbDocumentModel({
                doc_id: docItem.doc_id,// Key
                doc_name: doc.doc_name||'', // 更新name
                user_id: userId,
                update_by: userId,
            });
            updDocEntity.updateToDB(function(err){
                if (err) {
                    console.log('home.js [saveUserDocOnly2] update doc error: '+err);
                    return ret_func(0,CODE.UPDATE_DOC_ERROR);
                }

                // 删除pages
                var pageEntity = new ItbPageModel({
                    doc_id: docItem.doc_id,
                    update_by: userId
                });
                pageEntity.deletePagesByDocIdLogic(function(err2){
                    if (err2) {
                        console.log('home.js [saveUserDocOnly2] delete pages error: '+err2);
                        return ret_func(0,CODE.DELETE_PAGE_ERROR);
                    }

                    // 新建/更新pages
                    pageEntity.updatePages(function(err3,result){
                        if (err3) {
                            console.log('home.js [saveUserDocOnly2] insert pages error: '+err3);
                            return ret_func(0,CODE.CREATE_PAGE_ERROR);
                        }

                        var pageIds = result || [];// 已按page_index排序
                        var retData = {
                            user_id: userId,
                            doc_id: docItem.doc_id,
                            doc_name: doc.doc_name||'',
                            pages: pageIds
                        };

                        if(1==clrHis){
                            doClrHis(docItem.doc_id, function(err4, ret4){
                                if (err4) {
                                    console.log('home.js [saveUserDocOnly2] clrHis error: '+err4);
                                    return ret_func(0,CODE.OPERATION_FAILED);
                                }
                                return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                            });
                        } else {
                            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                        }

                    },docItem.doc_id,1,userId,doc.pages);
                });
            });
        }
    });

    // 删除切换模版记录
    function doClrHis(docId,callback){
        var url = CONFIG.SWITCH_SERVER_DOMAIN +':'+CONFIG.SWITCH_SERVER_PORT+'/switch/clrSwitchHis?'
            +'docId='+docId;

        superagent.get(url)
            .end(function(err, res){
                if(err){
                    console.log('home.js [saveUserDocOnly2] SuperAgent getHisList Err: ' + err);
                    return callback(err, null);
                }

                var retJson = JSON.parse(res.text);
                if(retJson.success){
                    return callback(null,retJson.data);

                } else {
                    return callback(retJson.msg, null);
                }
            }
        );
    }
}
router.get('/saveUserDocOnly2', saveUserDocOnly2);
router.post('/saveUserDocOnly2', saveUserDocOnly2);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 移动端发起排版请求（要求文档已经被保存过）
 * 方式:POST/GET
 * 参数: doc_id : 用户文档id
 * */
function typesetUserDocOnly(req, res, next) {
    var doc_id = req.body.doc_id || req.query.doc_id;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data:data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // TODO 排版生成预览图
    rpcFunc.typesetDoc(doc_id, function (ret) {

        getDocPreviewsData(doc_id,  ret_func);
    });

}

router.get('/typesetUserDocOnly', typesetUserDocOnly);
router.post('/typesetUserDocOnly', typesetUserDocOnly);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 转移临时用户数据到登录/注册用户下
 * 方式:POST
 * 参数 device: 0:PC, 1:iOS, 2:android
 * 参数 uuid: 设备唯一标识符
 * 参数 from: 临时用户id
 * 参数 to: 登录/注册用户id
 *
 * */
function moveTempDocToUser(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var temp_id = req.body.from || req.query.from || "";
    var user_id = req.body.to || req.query.to || "";
    var uuid = req.body.uuid || req.query.uuid;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof uuid=='undefined' || uuid == null || uuid.trim().length == 0){
        return ret_func(0,CODE.UUID_EMPTY);
    }
    if(typeof temp_id=='undefined' || temp_id == null || temp_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }

    // proc
    async.parallel({
        chkUserFrom: function(callback){
            var entityFrom = new ItbUserModel({
                user_id : temp_id,
                del_flg : 0
            });
            entityFrom.findFromDB(function(err, items) {
                if (err) {
                    console.log('home.js [moveTempDocToUser] check From-User error: ' + err);
                    callback(err, null);
                } else {
                    if (items != null && items.length > 0) {
                        callback(null, items[0]);

                    } else {
                        console.log('home.js [moveTempDocToUser] From-User does not exist!');
                        callback(CODE.USER_ID_INVAILD, null);
                    }
                }
            });
        },

        chkUserTo: function(callback){
            // 检索user
            var entityTo = new ItbUserModel({
                user_id : user_id,
                del_flg : 0
            });
            entityTo.findFromDB(function(error, items){
                if (error){
                    console.log('home.js [moveTempDocToUser] check To-User error: '+error);
                    callback(error, null);
                } else {
                    if (items != null && items.length > 0) {
                        callback(null, items[0]);

                    } else {
                        console.log('home.js [moveTempDocToUser] To-User does not exist!');
                        callback(CODE.USER_ID_INVAILD, null);
                    }
                }
            });
        }

    }, function(error, result){
        if (error) {
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        var userFrom = result.chkUserFrom;
        var userTo = result.chkUserTo;

        // From是否临时用户
        if (1 == userFrom.user_type && (userFrom.mobile == null || userFrom.mobile == "" || Number(userFrom.mobile) == 0)) {
            // To是否注册用户
            if (1 == userTo.user_type && userTo.mobile != null && userTo.mobile != "" && Number(userTo.mobile) > 0) {
                //
                var entity = new ItbDocumentModel({
                    user_id_from : userFrom.user_id,
                    user_id_to : userTo.user_id
                });
                entity.moveDocByUser(function(err,ret){
                    if (err) {
                        console.log('home.js [moveTempDocToUser] move doc error: ' + err);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }
                    return ret_func(1,CODE.OPERATION_SUCCESS);
                });

            } else {
                return ret_func(0,"不能移动数据到未注册用户");
            }

        } else {
            return ret_func(0,"不能移动非临时数据");
        }
    });

}
router.get('/moveTempDocToUser', moveTempDocToUser);
router.post('/moveTempDocToUser', moveTempDocToUser);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 获取指定用户下的文档数
 * 方式:POST
 * 参数 device: 0:PC, 1:iOS, 2:android
 * 参数 uuid: 设备唯一标识符
 * 参数 ids: 逗号连接的user_id
 * 返回值: {
 *           success: 1,
 *           msg: 成功,
 *           data: [ {user_id:1, count:18},
 *                   {user_id:2, count:20},
 *                 ...]
 *        }
 * */
function cntUserDoc(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;
    var ids = req.body.ids || req.query.ids || "";

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof ids=='undefined' || ids == null || ids.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }

    var entity = new ItbDocumentModel({
        ids : ids
    });
    entity.cntDocByUser(function(err,items){
        if (err) {
            console.log('home.js [cntUserDoc] cnt doc error: ' + err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        var retData = [];
        if (items!=null && items.length>0) {
            for (var i in items) {
                var itemData = {
                    user_id: items[i].user_id || '',
                    count: items[i].cnt || 0
                }
                retData.push(itemData);
            }
        }
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    });
}
router.get('/cntUserDoc', cntUserDoc);
router.post('/cntUserDoc', cntUserDoc);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 文档重命名(注:模版等非用户文档不能重命名)
 * 方式:POST
 * 参数 device: 0:PC, 1:iOS, 2:android
 * 参数 uuid: 设备唯一标识符
 * 参数 user_id: 用户ID
 * 参数 doc_id: 文档ID
 * 参数 doc_name: 文档名称
 * 返回值: {
 *           success: 1,
 *           msg: 成功,
 *           data: {old_name:XXX, new_name:YYY}
 *        }
 * */
function setDocName(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;
    var user_id = req.body.user_id || req.query.user_id || '';
    var doc_id = req.body.doc_id || req.query.doc_id;
    var doc_name = req.body.doc_name || req.query.doc_name || '';

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }

    // 检索文档
    var entity = new ItbDocumentModel({
        doc_id : doc_id,
        del_flg: 0
    });
    entity.findFromDB(function(err,items){
        if (err) {
            console.log('home.js [setDocName] find doc error: ' + err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        if (items!=null && items.length>0) {
            var docInfo = items[0];
            if (docInfo.user_type == 1 && docInfo.base_doc_id != null){
                // 更新
                var updEnt = new ItbDocumentModel({
                    doc_id: doc_id,
                    doc_name: doc_name,
                    update_by: user_id
                });
                updEnt.updateToDB(function(error,ret){
                    if (error) {
                        console.log('home.js [setDocName] update doc error: ' + error);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    var retData = {
                        old_name: docInfo.doc_name,
                        new_name: doc_name
                    };
                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                });

            } else {
                return ret_func(0,"不能重命名非用户文档");
            }

        } else {
            return ret_func(0,CODE.DOC_ID_INVAILD);
        }
    });
}
router.get('/setDocName', setDocName);
router.post('/setDocName', setDocName);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 移动端用户保存音视频.
 * 方式:POST
 * [必须]参数: pc       :1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * [必须]参数: user_id  : 用户唯一标识符
 * [必须]参数: uuid     : 设备唯一标识符
 * [必须]参数: flag     : 0:audio/video/media都更新, 1:只更新audio, 2:只更新video, 3:只更新media,  (未指定时默认为0)
 * [可选]参数: parse_flag    : 不存在或者0:不解析,1:解析media //TODO 控制是否解析原始视频
 * [必须]参数: pages    : 移动端文档的json字符串（数组）
         [{
             base_page_id: 122, // 对应后端的page_id
             audio: [{url: "xxx", duration: 10, local: "yyy"}], // 原始音频， 数组(url,时长,本地地址)
             video: [// 版本ver.2已改为audio同样结构,以下为版本ver.1结构
                        {
                            "frame":25,     // 帧率
                            "h":300,        //
                            "limit":25,     // 视频大图每行的小图个数
                            "duration":4,   // 总时间，单位：秒
                            "views":[       // 解析后的视频大图
                                "http://7xogoq.com1.z0.glb.clouddn.com/image/U13/20160120113430/FloihlxM1YIXIrqr8Fyf3wFVWFiP"
                            ],
                            "step":10,      // 每张大图的总时间，单位：秒
                            "w":200,
                            "url":[         // 解析后的音频地址
                                "http://7xogoq.com1.z0.glb.clouddn.com/audio/U13/20160120113430/FpxWKVqgQV-Yj1YUCxZVFNtuBtcF.mp3"
                            ]
                        }
                    ] , // 解析过的video数组， 数组
              media:[{url: xxx, duration: 10}], // 原始视频， 数组(url,时长)//TODO 传递原始视频
         }]
 * */
function updatePageMedia(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var user_id = req.body.user_id || req.query.user_id;
    var flag = req.body.flag || req.query.flag || "0";
    var parse_flg = req.body.parse_flag || req.query.parse_flag || "0";
    var pages = req.body.pages || req.query.pages;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }

    // 检索user
    var entity = new ItbUserModel({
        user_id    : user_id,
        del_flg : 0
    });
    entity.findFromDB(function(error, items){
        if (error){
            console.log('home.js [updatePageMedia] select user error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        if (items != null && items.length > 0) {
            var item = items[0];

            // 同步更新
            var asyncFuncs = [];
            for (var i in pages) {
                asyncFuncs.push((function (index, data) {
                    return function (asyncCallback) {

                        if (parse_flg == "1" && data.media && data.media.length>0) {
                            // 暂时只处理第一个 TODO

                            // 检查是否已经解析过
                            var chkEntity = new ItbPageModel({
                                page_ids: data.base_page_id
                            });
                            chkEntity.getPagesInfoByPageIds(function(err2, ret2){
                                if (err2) {
                                    console.log('getPagesInfoByPageIds error: '+err2);
                                    asyncCallback(err2, ret2);
                                } else {
                                    var bParse = true;
                                    if (ret2 && ret2.length>0) {
                                        var pageItem = ret2[0];
                                        if (pageItem.video && pageItem.media &&
                                            pageItem.media == JSON.stringify(data.media||[])) {
                                            bParse = false;
                                        }
                                    }

                                    if (bParse) {
                                        // 解析视频
                                        rpcFunc.parseVideo(data.media[0].url, function (parseInfo) {
                                            var videoInfo = [];
                                            if (parseInfo) {// 解析成功
                                                videoInfo.push(parseInfo);
                                                data.video = videoInfo;
                                                var entity2 = new ItbPageModel({
                                                    update_by : item.user_name || item.user_id,
                                                    page_media : data,
                                                    flag: flag
                                                });
                                                entity2.updatePageMediaInfo(function(err3, ret3){
                                                    if (err3) {
                                                        console.log('updatePageMediaInfo error: '+err3);
                                                    }
                                                    asyncCallback(err3, ret3);
                                                });

                                            } else {// 解析失败
                                                asyncCallback("ParseVideoError", null);
                                            }
                                        });
                                    } else {
                                        asyncCallback(null, null);
                                    }
                                }
                            });

                        } else {
                            var entity2 = new ItbPageModel({
                                update_by : item.user_name || item.user_id,
                                page_media : data,
                                flag: flag
                            });
                            entity2.updatePageMediaInfo(function(error2, ret){
                                if (error2) {
                                    console.log('updatePageMediaInfo error: '+error2);
                                }
                                asyncCallback(error2, ret);
                            });
                        }
                    }
                })(i, pages[i])); // 利用闭包解决动态参数传递问题
            }
            async.parallel(asyncFuncs, function (err, results) {
                if (err) {
                    console.log('home.js [updatePageMedia] update error: '+err);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                return ret_func(1,CODE.OPERATION_SUCCESS);
            });

        } else {
            return ret_func(0,CODE.UNKNOWN_USER);
        }
    });
}
router.get('/updatePageMedia', updatePageMedia);
router.post('/updatePageMedia', updatePageMedia);
//------------------------------------------------------------------


/* 移动端用户获取音视频.
 * 方式:POST
 * 参数: pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数: uuid    : 设备唯一标识符
 * 参数: doc_id  : 文档id
 * 参数: page_ids: 请求的文档页id(可跟多个 base_page_id, 用逗号隔开)
 *
 * 注意: doc_id和page_ids不能同时为空
 *      doc_id不为空,page_ids为空:根据doc_id获取文档页信息
 *      doc_id不为空,page_ids不为空:根据doc_id获取文档页信息
 *      doc_id为空,page_ids不为空:根据page_ids获取文档页信息
 *
 * 返回:
     var obj = {
             success:1,
             msg:'success',
             "data": [
                     {
                         base_page_id: 123,
                         page_index: 0,
                         thumb: "http://yyyy.jpg",
                         audio:[{url: xxx, duration: 10}],
                         video:[{}],
                         media:[{}]
                     },
                     {
                         base_page_id: 124,
                         page_index: 1,
                         thumb: "http://yyyy.jpg",
                         audio:[{url: xxx, duration: 10}],
                         video:[{}],
                         media:[{}]
                     }
                 ]
           };
 * */
function getPageMedia(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var doc_id = req.body.doc_id || req.query.doc_id;
    var page_ids = req.body.page_ids || req.query.page_ids;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if( (typeof doc_id=='undefined' || doc_id == null || doc_id.trim().length == 0) &&
        (typeof page_ids=='undefined' || page_ids == null || page_ids.trim().length == 0) ){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    // process success
    function proc_func(items){
        var pageData = [];
        if (items != null && items.length > 0) {
            for (var i in items){
                var item = items[i];

                var arrA = [];
                var arrV = [];
                var arrM = [];

                if (item.audio != null && item.audio.trim().length > 0) {
                    arrA = JSON.parse(item.audio);
                }
                if (item.video != null && item.video.trim().length > 0) {
                    arrV = JSON.parse(item.video);
                }
                if (item.media != null && item.media.trim().length > 0) {
                    arrM = JSON.parse(item.media);
                }

                // 组合page数据
                var pageItem = {
                    base_page_id: item.page_id,
                    page_index: item.page_index,
                    thumb: item.thumb_s || '',
                    audio: arrA,
                    video: arrV,
                    media: arrM
                };
                pageData.push(pageItem);
            }
        }

        return ret_func(1,CODE.OPERATION_SUCCESS,pageData);
    }

    if (doc_id != null && doc_id.length > 0) {
        var entity = new ItbDocumentModel({
            doc_id:doc_id
        });
        entity.getPagesInfoByDocId(function(error, items){
            if(error){
                console.log('home.js [getPageMedia] by doc_id error: '+error);
                return ret_func(0,CODE.OPERATION_FAILED);
            }

            proc_func(items);
        });

    } else {
        var entity2 = new ItbPageModel({
            page_ids:page_ids
        });
        entity2.getPagesInfoByPageIds(function(error, items){
            if(error){
                console.log('home.js [getPageMedia] by page_ids error: '+error);
                return ret_func(0,CODE.OPERATION_FAILED);
            }

            proc_func(items);
        });
    }
}
router.get('/getPageMedia', getPageMedia);
router.post('/getPageMedia', getPageMedia);
//------------------------------------------------------------------

/* 清除文档页的audio，video信息
 * 方式:POST
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:user_id
 * 参数:base_doc_id
 * */
function clearDocMedia(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var user_id = req.body.user_id || req.query.user_id;
    var doc_id = req.body.base_doc_id || req.query.base_doc_id;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }
    if(typeof doc_id=='undefined' || doc_id == null){   //|| doc_id.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    // 检索user
    var entity = new ItbUserModel({
        user_id    : user_id,
        del_flg : 0
    });
    entity.findFromDB(function(error, items){
        if (error){
            console.log('home.js [clearDocMedia] select user error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        if (items != null && items.length > 0) {
            var item = items[0];

            var entity2 = new ItbPageModel({
                update_by : item.user_name || item.user_id,
                doc_id : doc_id,
            });
            entity2.clearPagesMediaInfo(function(err, ret){
                if (err) {
                    console.log('home.js [clearDocMedia] update error: '+err);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                return ret_func(1,CODE.OPERATION_SUCCESS);
            });

        } else {
            return ret_func(0,CODE.UNKNOWN_USER);
        }
    });
}
router.get('/clearDocMedia', clearDocMedia);
router.post('/clearDocMedia', clearDocMedia);
//------------------------------------------------------------------

/* 移动端从服务器获取用于上传的token字符串.
 * 方式:GET
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:user_id
 * 参数:type: 0图片，1音频，2视频
 *
 * 文件名: [(type)/("U"+userId/"T"+random)/(YYYYMMDDhhmmss)/(hash)]
 * */
qiniu.conf.ACCESS_KEY = 'qBaIavtWjRjUYzTfDYm-Lm9jRAWFBTnnzZrl0zSR';
qiniu.conf.SECRET_KEY = 'dRVZbaztjuWUUfjwTF8gnLu1cgJZ3lVNAaM7jmR3';
qn_domain = 'http://7xogoq.com1.z0.glb.clouddn.com';
qn_bucket = 'itbour-image';
function getToken(req, res, next) {
    var type = req.body.type || req.query.type || "0";
    var id = req.body.user_id || req.query.user_id || null;
    if (typeof id=='undefined' || id == null || id.trim().length == 0){
        // userId不存在时
        id = "T"+Math.floor(Math.random()*1000000);
    } else {
        id = "U"+id;
    }

    var putPolicyObj = {};
    putPolicyObj.scope = qn_bucket;
    putPolicyObj.insertOnly = 1; // 仅能以新增模式上传文件

    var tmpNm = "/$(year)$(mon)$(day)$(hour)$(min)$(sec)/$(etag)";
    if (type == "1") {
        putPolicyObj.saveKey = "audio/"+id+tmpNm+".mp3";
        putPolicyObj.mimeLimit = "audio/*;application/octet-stream";// 只允许上传音频类型
    } else if (type == "2") {
        putPolicyObj.saveKey = "video/"+id+tmpNm;
        putPolicyObj.mimeLimit = "video/*";// 只允许上传视频类型
    } else {
        putPolicyObj.saveKey = "image/"+id+tmpNm;
        putPolicyObj.mimeLimit = "image/*";// 只允许上传图片类型
    }

    putPolicyObj.expires = 3600;
    var putPolicy = new qiniu.rs.PutPolicy2(putPolicyObj);
    var obj = {
        success:1,msg:'success',
        data:{
            token:putPolicy.token(),// token字符串
        }
    };
    res.set('Content-Type', 'application/json');
    res.json(obj);
}
router.get('/getToken', getToken);
router.post('/getToken', getToken);
//------------------------------------------------------------------
/*
 * 移动端获取服务器排版好的文档缩略图的数据
 * 参数:base_doc_ids:请求的文档id(可跟多个 base_doc_id, 用逗号隔开)
 * 参数: user_id : 用户唯一标识符(user_id 和 uuid 可能有一个)
 * 参数: uuid    : 设备唯一标识符
 * 参数:ret_func : 回调函数，参数如：
 *                  success,
 *                  msg,
 *                  data
 * */
function getDocPreviewsData(base_doc_ids, ret_func){
    // check parameter
    if(typeof base_doc_ids=='undefined' || base_doc_ids == null || base_doc_ids.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var entity = new ItbPageModel({
        doc_ids:base_doc_ids
    });
    entity.getPagesInfoByDocIds(function(error, items){
        if(error){
            console.log('home.js [getDocPreviews] error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // process success
        var retData = [];
        var pageData = [];
        if (items != null && items.length > 0) {
            var bSkip = false;// 该doc是否跳过
            var tmpDocId = items[0].doc_id;

            for (var i in items){
                var item = items[i];

                // 只要有未生成预览图的页面，对应doc就不返回
                if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                    bSkip = true;
                }

                // 文档id变更时组合文档数据
                if (tmpDocId != item.doc_id) {
                    var docItem = {
                        base_doc_id: tmpDocId,
                        pages: pageData
                    }
                    if (!bSkip){
                        retData.push(docItem);// 返回该doc数据
                    }

                    tmpDocId = item.doc_id;
                    pageData.splice(0);
                    bSkip = false;
                }

                // 组合page数据
                var pageItem = {
                    base_page_id: item.page_id,
                    image: item.thumb_s
                };
                pageData.push(pageItem);

                // 最后一条
                if (i == items.length -1) {
                    var docItem = {
                        base_doc_id: tmpDocId,
                        pages: pageData
                    }
                    if (!bSkip){
                        retData.push(docItem);// 返回该doc数据
                    }
                }
            }
        }

        console.log('home.js [getDocPreviews] retData: '+ retData);
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    });
}

/*
 * 移动端获取服务器排版好的文档缩略图
 * 参数:mobile:1手机/2PC
 * 参数:base_doc_ids:请求的文档id(可跟多个 base_doc_id, 用逗号隔开)
 * 参数: user_id : 用户唯一标识符(user_id 和 uuid 可能有一个)
 * 参数: uuid    : 设备唯一标识符
 * 
 * data:返回doc数组(包含page数组)，只要有一个page未生成预览图则对应的doc不返回
 * */
function getDocPreviews(req, res, next) {
    //var obj = {
    //    success:1,msg:'success',
    //    "data": [
    //        {
    //            base_doc_id: 123,
    //            pages:[
    //                {
    //                    "base_page_id": 111,
    //                    "image": BASE_IP + '/images/page1.jpg'
    //                },
    //                {
    //                    "base_page_id": 222,
    //                    "image": BASE_IP + '/images/page2.jpg'
    //                }
    //            ]
    //        },
    //        {
    //            base_doc_id: 124,
    //            pages:[
    //                {
    //                    "base_page_id": 555,
    //                    "image": BASE_IP + '/images/page2.jpg'
    //                },
    //                {
    //                    "base_page_id": 666,
    //                    "image": BASE_IP + '/images/page3.jpg'
    //                }
    //            ]
    //        }
    //    ]
    //};

    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var base_doc_ids = req.body.base_doc_ids || req.query.base_doc_ids;
    var user_id = req.body.user_id || req.query.user_id;
    var uuid = req.body.uuid || req.query.uuid;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }



    // 获取预览图数据
    getDocPreviewsData(base_doc_ids, ret_func);

}
router.get('/getDocPreviews', getDocPreviews);
router.post('/getDocPreviews', getDocPreviews);
//------------------------------------------------------------------

/* 生成贺卡用自动排版
 * type: 1:亲友, 2:老板, 3:学生, 4:上班族, 5:创业者
 * name: 发送者姓名
 * videoUrl: 视频地址
 * */
function typesetCard(req, res, next) {
    // get parameter
    var type = req.body.type || req.query.type || "1";
    var name = req.body.name || req.query.name || "";
    var videoUrl = req.body.videoUrl || req.query.videoUrl || "";

    var tmplId = CONFIG.GET_CARD_TEMPLATE_ID(Number(type));

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    console.log('home.js [typesetCard] videoUrl: ' + videoUrl);

    // 获取贺卡模版文档
    var entityDoc = new ItbTemplateModel({
        tmpl_id:tmplId,
        del_flg:0
    });
    entityDoc.findFromDB(function(err, items) {
        if (err) {
            console.log('home.js [typesetCard] find template error: ' + err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        if (items == null || items.length < 1){
            console.log('home.js [typesetCard] template not exist ');
            return ret_func(0,CODE.OPERATION_FAILED)
        }

        var tmplItem = items[0];
        if (0 == tmplItem.user_type) {// 模版数据
            //
            // 新建用户数据
            var newDocEntity = new ItbDocumentModel({
                base_doc_id: tmplItem.tmpl_id,
                doc_name: '用户贺卡',
                user_id: 0,// 临时user
                user_type: 1,
                publish: 0,
                ver:tmplItem.ver
            });
            // insert document
            newDocEntity.saveToDB(function(err2, newDocId){
                if (err2) {
                    console.log('home.js [typesetCard] insert doc error: '+err2);
                    return ret_func(0,CODE.CREATE_DOC_ERROR);
                }
                console.log('home.js [typesetCard] new docId: ' + newDocId);

                // 新建pages
                var pageEntity = new ItbPageModel({
                    docId: newDocId,
                    templateId: tmplId
                });
                pageEntity.copyPagesByDocIdForCard(function(err3){
                    if (err3) {
                        console.log('home.js [typesetCard] insert pages error: '+err3);
                        return ret_func(0,CODE.CREATE_PAGE_ERROR);
                    }

                    // 取第一页数据
                    var pageOneEntity = new ItbPageModel({
                        doc_id: newDocId,
                        page_index: 0,
                        del_flg: 0
                    });
                    pageOneEntity.findFromDB(function(err4, results){
                        if (err4){
                            console.log('home.js [typesetCard] select page_0 error: '+err4);
                            return ret_func(0,CODE.CREATE_PAGE_ERROR);
                        }

                        var pageOne = results[0];
                        console.log('home.js [typesetCard] pages[0].page_id: ' + pageOne.page_id);


                        // 并行处理视频解析和自动排版
                        async.parallel({
                            procVideo: function(callback){
                                if (videoUrl && videoUrl.length>0){
                                    // 解析视频
                                    rpcFunc.parseVideo(videoUrl, function (parseInfo) {
                                        var videoInfo = [];
                                        if (parseInfo) {
                                            videoInfo.push(parseInfo);
                                        }

                                        // 更新第一页的video信息
                                        var updEntity = new ItbPageModel({
                                            page_id: pageOne.page_id,
                                            video: JSON.stringify(videoInfo)
                                        });
                                        updEntity.updateForCard(function(err5, updRet){
                                            if (err5){
                                                console.log('home.js [typesetCard] update page_0 error: '+err5);
                                                callback(CODE.CREATE_PAGE_ERROR,null);
                                            }

                                            callback(null, updRet);
                                        });
                                    });
                                } else {
                                    callback(null, null);// 无视频
                                }
                            },

                            procAuto: function(callback){
                                var replaceInfo = JSON.parse(pageOne.replaces);
                                var stopFlg = false;
                                if (replaceInfo && replaceInfo.length>0){
                                    for (var n in replaceInfo){
                                        if(stopFlg) break;
                                        var replace = replaceInfo[n];
                                        for (var m in replace.value){
                                            var repItem = replace.value[m];
                                            if (Number(repItem.ct) == 808){// 文字组
                                                var msg = name + '祝您：' + CONFIG.GET_WISH_MSG();
                                                replace.value[m].value = msg;
                                                stopFlg = true;
                                                break;
                                            }
                                        }
                                    }
                                }

                                // 更新第一页的replaces信息
                                var updEntity = new ItbPageModel({
                                    page_id: pageOne.page_id,
                                    replaces: JSON.stringify(replaceInfo)
                                });
                                updEntity.updateForCard(function(err5, updRet){
                                    if (err5){
                                        console.log('home.js [typesetCard] update page_0 error: '+err5);
                                        callback(CODE.CREATE_PAGE_ERROR,null);
                                    }

                                    // 排版生成预览图(仅第一页)
                                    rpcFunc.typesetDocPage(newDocId, pageOne.page_id, function (autoRet) {
                                        callback(null,autoRet);
                                    });
                                });
                            }

                        }, function(error, result) {
                            if (error) {
                                return ret_func(0, CODE.OPERATION_FAILED);
                            }

                            var videoRet = result.procVideo;
                            var autoRet = result.procAuto;

                            var retData = {
                                doc_id: newDocId
                            }
                            return ret_func(1,CODE.OPERATION_SUCCESS, retData);
                        });

                    });
                });
            });
        }
    });

}
router.get('/typesetCard', typesetCard);
router.post('/typesetCard', typesetCard);
//------------------------------------------------------------------

/* 生成娱乐用自动排版-1
 * 参数 name: 姓名
 * return: 新建文档ID
 * */
function procEntainment1(req, res, next) {
    // get parameter
    var name = req.body.name || req.query.name || "XXX";

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // 获取娱乐用模版
    var entityDoc = new ItbTemplateModel({});
    entityDoc.getLatestEntDoc(function(err, items) {
        if (err) {
            console.log('home.js [procEntainment1] find template error: ' + err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        if (items == null || items.length < 1){
            console.log('home.js [procEntainment1] template does not exist ');
            return ret_func(0,CODE.OPERATION_FAILED)
        }

        var docItem = items[0];
        console.log('home.js [procEntainment1] template TmplId: ' + docItem.tmpl_id);

        // 新建用户数据
        var newDocEntity = new ItbDocumentModel({
            base_doc_id: docItem.tmpl_id,
            doc_name: '娱乐文档',
            user_id: 0,// 临时user
            user_type: 1,
            publish: 0,
            ver:docItem.ver
        });
        // insert document
        newDocEntity.saveToDB(function(err2, newDocId){
            if (err2) {
                console.log('home.js [procEntainment1] insert new doc error: '+err2);
                return ret_func(0,CODE.CREATE_DOC_ERROR);
            }
            console.log('home.js [procEntainment1] new docId: ' + newDocId);

            // 新建pages
            var pageEntity = new ItbPageModel({
                docId: newDocId,
                templateId: docItem.tmpl_id
            });
            pageEntity.copyPagesByDocIdForEnt(function(err3){
                if (err3) {
                    console.log('home.js [procEntainment1] insert new pages error: '+err3);
                    return ret_func(0,CODE.CREATE_PAGE_ERROR);
                }

                // 取新建页
                var newPageEntity = new ItbPageModel({
                    doc_id: newDocId,
                    del_flg: 0
                });
                newPageEntity.findFromDB(function(err4, pages){
                    if (err4){
                        console.log('home.js [procEntainment1] select new pages error: '+err4);
                        return ret_func(0,CODE.CREATE_PAGE_ERROR);
                    }

                    if (pages && pages.length > 0) {
                        // 同步更新
                        var asyncFuncs = [];
                        for (var i in pages) {
                            asyncFuncs.push((function (index, pageData) {
                                return function (asyncCallback) {

                                    // 设置replaces信息
                                    var replaceInfo = JSON.parse(pageData.replaces);
                                    var stopFlg = false;
                                    if (replaceInfo && replaceInfo.length>0){
                                        for (var n in replaceInfo){
                                            if(stopFlg) break;
                                            var replace = replaceInfo[n];
                                            for (var m in replace.value){
                                                var repItem = replace.value[m];
                                                if (Number(repItem.ct) == 808){// 文字组
                                                    // 替换文字
                                                    var msg = name;
                                                    replace.value[m].value = msg;
                                                    stopFlg = true;// TODO
                                                    break;
                                                }
                                            }
                                        }
                                    }

                                    // 更新page的replaces信息
                                    var updEntity = new ItbPageModel({
                                        page_id: pageData.page_id,
                                        replaces: JSON.stringify(replaceInfo)
                                    });
                                    updEntity.updateForCard(function(err5, updRet){
                                        if (err5){
                                            console.log('home.js [procEntainment1] update replaces error: '+err5);
                                            return callback(CODE.CREATE_PAGE_ERROR,null);
                                        }

                                        // 排版生成预览图
                                        rpcFunc.typesetDocPage(newDocId, pageData.page_id, function (autoRet) {
                                            callback(null,autoRet);
                                        });
                                    });
                                }

                            })(i, pages[i])); // 利用闭包解决动态参数传递问题
                        }
                        async.parallel(asyncFuncs, function (error, results) {
                            if (error) {
                                console.log('home.js [procEntainment1] typesetDocPage error: '+error);
                                return ret_func(0,CODE.OPERATION_FAILED);
                            }

                            var retData = {
                                doc_id: newDocId
                            }
                            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                        });

                    }
                });
            });
        });
    });

}
router.get('/procEntainment1', procEntainment1);
router.post('/procEntainment1', procEntainment1);
//------------------------------------------------------------------

/* 设置文档是否追踪
 * 方式:GET
 * 参数mobile: 1手机/2PC
 * 参数ids: 逗号连接的文档id
 * 参数flag: 0或空:取消追踪, 1:设置追踪 (默认0)
 * 参数user_id: 更新者
 * */
function setDocTrack(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var ids = req.body.ids || req.query.ids;
    var track = Number(req.body.flag || req.query.flag || '0');
    var user_id = req.body.user_id || req.query.user_id || 'unknown';

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof ids=='undefined' || ids == null || ids.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }

    var entity = new ItbDocumentModel({
        track:track,
        ids:ids,
        update_by:user_id
    });
    entity.setDocTrack(function(error, ret){
        if(error){
            console.log('home.js [setDocTrack] error: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        return ret_func(1,CODE.OPERATION_SUCCESS);
    });
}
router.get('/setDocTrack', setDocTrack);
router.post('/setDocTrack', setDocTrack);
//------------------------------------------------------------------

/* 获取文档追踪数据
 * 方式:GET
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:docId: 文档id
 * 参数:type: 类型(1阅读次数,2转发次数,3收藏次数...)
 * 参数:period: 数据期限(最近天数),0或空则统计所有
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data: [
 *     {day: YYYYMMDD, value: 10},
 *     {day: YYYYMMDD, value: 20},
 *     ...
 *   ]
 * }
 * */
function getTrackInfo(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var type = Number(req.body.type || req.query.type || '0');
    var period = Number(req.body.period || req.query.period || '0');
    var docId = req.body.docId || req.query.docId;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof docId=='undefined' || docId == null || docId.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }
    if (period < 0) {
        return ret_func(0,"无效期限");
    }
    if (type <= 0 || type >= 4) {
        return ret_func(0,"未知类型");
    }

    var entity = new ItbDocumentModel({
        doc_id:docId,
        period:period,
        type:type
    });
    entity.getDayTrackInfoByDocId(function(err, results){
        if (err) {
            console.log('home.js [getTrackInfo] err: '+err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        // 组合返回数据
        var retData = [];
        // 未指定期限的场合
        if (period == 0) {
            if (results != null && results.length > 0) {
                // 查找目标日期数据
                for (var n in results){
                    var item = results[n];

                    var itemData = {
                        day: item.day,
                        value: item.cnt
                    };
                    retData.push(itemData);
                }
            }

        // 指定了期限的场合
        } else {
            var startDate = moment(new Date()).subtract(period,'days');
            for (var i=0; i<period; i++) {
                var strYmd = startDate.add(1,'days').format('YYYYMMDD');

                var item = null;
                if (results != null && results.length > 0) {
                    // 查找目标日期数据
                    for (var n in results){
                        item = results[n];

                        if (item.day == strYmd) {
                            break;
                        } else {
                            item = null;
                        }
                    }
                }

                var itemData = null;
                if (item) {// 目标日有数据
                    itemData = {
                        day: item.day,
                        value: item.cnt
                    };
                } else {// 目标日无数据
                    itemData = {
                        day: strYmd,
                        value: 0
                    };
                }
                retData.push(itemData);
            }
        }

        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    });

    //if (1 == type){// 阅读次数
    //    var entity1 = new ItbBrowseInfoModel({
    //        doc_id:docId,
    //        period:period
    //    });
    //    entity1.cntByDocId(function(err, cnt){
    //        if (err) {
    //            console.log('home.js [getTrackInfo] err: '+err);
    //            return ret_func(0,CODE.OPERATION_FAILED);
    //        }
    //        return ret_func(1,CODE.OPERATION_SUCCESS,{type:1,count:cnt});
    //    });
    //
    //} else if (2 == type){// 转发次数
    //    var entity2 = new ItbRelayInfoModel({
    //        doc_id:docId,
    //        period:period
    //    });
    //    entity2.cntByDocId(function(err, cnt){
    //        if (err) {
    //            console.log('home.js [getTrackInfo] err: '+err);
    //            return ret_func(0,CODE.OPERATION_FAILED);
    //        }
    //        return ret_func(1,CODE.OPERATION_SUCCESS,{type:2,count:cnt});
    //    });
    //
    //} else if (3 == type) {// 收藏次数
    //    var entity3 = new ItbCollectModel({
    //        doc_id:docId,
    //        period:period
    //    });
    //    entity3.cntByDocId(function(err, cnt){
    //        if (err) {
    //            console.log('home.js [getTrackInfo] err: '+err);
    //            return ret_func(0,CODE.OPERATION_FAILED);
    //        }
    //        return ret_func(1,CODE.OPERATION_SUCCESS,{type:3,count:cnt});
    //    });
    //
    //} else {
    //    return ret_func(0,"未知类型");
    //}
}
router.get('/getTrackInfo', getTrackInfo);
router.post('/getTrackInfo', getTrackInfo);
//------------------------------------------------------------------

/* 获取文档追踪数据
 * 方式:GET
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:ids: 逗号连接的文档id
 * 参数:period: 数据期限(最近天数),0或空则统计所有
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data:[
 *     {
 *       id: 1,// 文档id
 *       track: 1,// 是否追踪(是)
 *       read: 10,// 阅读次数
 *       duration: 200,// 阅读秒数
 *       relay: 20,// 转发次数
 *       collect: 30// 收藏次数
 *     },
 *     {
 *       id: 2,// 文档id
 *       track: 0,// 是否追踪(否)
 *       read: 0,// 阅读次数
 *       duration: 0,// 阅读秒数
 *       relay: 0,// 转发次数
 *       collect: 0// 收藏次数
 *     },
 *     ...
 *   ]
 * }
 * */
function getAllTrackInfo(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var period = Number(req.body.period || req.query.period || '0');
    var ids = req.body.ids || req.query.ids;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof ids=='undefined' || ids == null || ids.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }
    if (period < 0) {
        return ret_func(0,"无效期限");
    }

    var entity = new ItbDocumentModel({
        ids:ids,
        period:period,
        type:0
    });
    entity.getTrackInfoByDocId(function(err, results){
        if (err) {
            console.log('home.js [getAllTrackInfo] err: '+err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        var retData = [];
        if (results != null && results.length > 0) {
            for (var i in results){
                var item = results[i];

                var itemData = {
                    id: item.doc_id,
                    track: item.track,
                    read: item.read_cnt || 0,
                    duration: item.duration || 0,
                    relay: item.relay_cnt || 0,
                };
                retData.push(itemData);
            }
        }
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    });
}
router.get('/getAllTrackInfo', getAllTrackInfo);
router.post('/getAllTrackInfo', getAllTrackInfo);
//------------------------------------------------------------------

/* 获取文档追踪数据
 * 方式:GET
 * 参数:pc:1表示从pc来的请求/为空或者其它值表示从手机来的请求
 * 参数:docId: 文档id
 * 参数:orderBy: 排序方式(1阅读时长,2转发次数,3最新)
 * 参数:page: 页码,从0开始
 * 参数:pageSize: 每页容量
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data: [
 *     {
 *       icon: "http://xxxx.jpg",// 头像
 *       name: "haha",           // 昵称
 *       read: 10,               // 阅读次数
 *       duration: 250,          // 阅读秒数
 *       relay: 10,              // 转发次数
 *       collect: 1,             // 1:已收藏, 0:未收藏
 *     },
 *     {
 *       icon: "http://yyyy.jpg",// 头像
 *       name: "xixi",           // 昵称
 *       read: 10,               // 阅读次数
 *       duration: 250,          // 阅读秒数
 *       relay: 10,              // 转发次数
 *       collect: 1,             // 1:已收藏, 0:未收藏
 *     },
 *     ...
 *   ]
 * }
 * */
function getUserTrackInfo(req, res, next) {
    // get parameter
    var pc = req.body.pc || req.query.pc;// TODO
    var docId = req.body.docId || req.query.docId;
    var orderBy = Number(req.body.orderBy || req.query.orderBy || '0');
    var pageNum = req.body.page || req.query.page;
    var pageSize = req.body.pageSize || req.query.pageSize;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof docId=='undefined' || docId == null || docId.trim().length == 0){
        return ret_func(0,CODE.DOC_ID_EMPTY);
    }
    if(typeof pageNum=='undefined' || pageNum == null || pageNum.trim().length == 0){
        return ret_func(0,CODE.PAGENUM_EMPTY);
    }
    if(typeof pageSize=='undefined' || pageSize == null || pageSize.trim().length == 0){
        return ret_func(0,CODE.PAGESIZE_EMPTY);
    }

    // 分页: 跳过条数
    var skipCnt = Number(pageNum) * Number(pageSize);

    var entity = new ItbDocumentModel({
        doc_id:docId,
    });
    entity.getWxUserTrackInfo(function(err, results){
        if (err) {
            console.log('home.js [getUserTrackInfo] err: '+err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }
        var retData = [];
        if (results != null && results.length > 0) {
            for (var i in results){
                var item = results[i];

                var itemData = {
                    icon: item.headimgurl || '',
                    name: item.nickname || '',
                    read: item.read_cnt || 0,
                    duration: item.duration || 0,
                    relay: item.relay_cnt || 0,
                };

                retData.push(itemData);
            }
        }
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    }, orderBy, skipCnt, pageSize);
}
router.get('/getUserTrackInfo', getUserTrackInfo);
router.post('/getUserTrackInfo', getUserTrackInfo);
//------------------------------------------------------------------
/* 获取[个人中心]信息
 * 方式:GET
 * 参数 device: 0表示从pc,1表示iOS,2表示android
 * 参数 uuid: 设备标识
 * 参数 user_id: 用户ID
 * 参数 order_by: 1:create_time倒序,0或空:doc_id顺序
 * 参数 track: 等于1时返回文档追踪信息,否则不返回追踪信息
 * 参数 pageNum: 页码,从0开始[为空时默认为0]
 * 参数 pageSize: 每页容量[等于0或为空时忽略pageNum获取全部记录]
 * 参数 ret_flg: 等于1时只返回文档id,其他情况时返回下列所有信息
 * 参数[可选]  withTotalPage: 1表示需要返回总页数
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data: [
 *     {
 *       base_doc_id: 111, // 用户文档id
 *       tmpl_doc_id: 12, // 模版id
 *       create_time: "2016-04-27 09:30:56",
 *       thumb: "http://xxxx.jpg",
 *       title: "文档名称",
 *       track: 1,// 是否追踪
 *       trackInfo: {
 *                read: 10,       // 阅读次数
 *                duration: 250,  // 阅读秒数
 *                relay: 10,      // 转发次数
 *                collect: 1,     // 1:已收藏, 0:未收藏 (暂无)
 *              }
 *     },
 *     ...
 *   ]
 * }
 * */
function getUserCenterInfo(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;
    var user_id = req.body.user_id || req.query.user_id;
    var track = req.body.track || req.query.track || 0;
    var pageNum = req.body.pageNum || req.query.pageNum || 0;
    var pageSize = req.body.pageSize || req.query.pageSize || 0;
    var order_by = req.body.order_by || req.query.order_by || 0;
    var ret_flg = req.body.ret_flg || req.query.ret_flg || 0;
    var withTotalPage = req.body.withTotalPage || req.query.withTotalPage || 0;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }
    if(typeof pageNum=='undefined' || pageNum == null){
        return ret_func(0,CODE.PAGENUM_EMPTY);
    }
    //if(typeof pageSize=='undefined' || pageSize == null || pageSize == 0){
    //    return ret_func(0,CODE.PAGESIZE_EMPTY);
    //}

    // 分页: 跳过条数
    var skipCnt = Number(pageNum) * Number(pageSize);
    if (pageSize == 0) pageSize = null;

    var entity = new ItbDocumentModel({
        user_id: user_id,
    });
    entity.getDocInfoByUser(function(err, results){
        if (err) {
            console.log('home.js [getUserCenterInfo] find doc err: '+err);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        function processData(totalPageCount){
            var retData = [];
            var docIds = '';
            if (results != null && results.length > 0) {
                for (var i in results){
                    var item = results[i];
                    if (0 == i) {
                        docIds = item.doc_id;
                    } else {
                        docIds += (',' + item.doc_id);
                    }

                    var itemData = {};
                    if (ret_flg == 1) {
                        itemData.base_doc_id = item.doc_id;
                        itemData.tmpl_doc_id = item.base_doc_id;
                    } else {
                        itemData.base_doc_id = item.doc_id;
                        itemData.tmpl_doc_id = item.base_doc_id;
                        itemData.create_time = item.create_time || '';
                        itemData.thumb = item.thumb || item.thumb2 || '';// thumb2为模版预览图
                        itemData.title = item.doc_name || '';
                        itemData.track = item.track || 0;
                    }
                    if(withTotalPage){
                        itemData.totalPageCount=totalPageCount;
                    }
                    retData.push(itemData);
                }
            }

            if (track == 1 && ret_flg == 0 && docIds.length>0) {
                var entity2 = new ItbDocumentModel({
                    ids:docIds,
                    type:0
                });
                entity2.getTrackInfoByDocId(function(err2, items){
                    if (err2) {
                        console.log('home.js [getUserCenterInfo] get track info err: '+err2);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    if (items != null && items.length > 0) {
                        for (var n in items){
                            var trackItem = items[n];
                            for (var j in retData){
                                if (trackItem.doc_id == retData[j].base_doc_id){
                                    var trackData = {
                                        read: trackItem.read_cnt || 0,
                                        duration: trackItem.duration || 0,
                                        relay: trackItem.relay_cnt || 0,
                                    }
                                    retData[j].trackInfo = trackData;
                                    break;
                                }
                            }
                        }
                    }
                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                });

            } else {
                return ret_func(1,CODE.OPERATION_SUCCESS,retData);
            }
        }

        if(withTotalPage){
            entity.getDocCountInfoByUser(function(err, count) {
                if (err) {
                    console.log('home.js [getUserCenterInfo] getDocCountInfoByUser err: ' + err);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                var pgCnt = 1;
                if(pageSize && pageSize>0) {
                    pgCnt = Math.floor((count-1)/pageSize)+1
                }
                processData(pgCnt);
            });
        }else{
            processData(0);
        }



    }, skipCnt, pageSize, order_by);
}
router.get('/getUserCenterInfo', getUserCenterInfo);
router.post('/getUserCenterInfo', getUserCenterInfo);
//------------------------------------------------------------------
//------------------------------------------------------------------
/* 获取阿里云OSS上传signature
 * 方式:GET
 * 参数 device: 0表示从pc,1表示iOS,2表示android
 * 参数 uuid: 设备标识
 * 参数 user_id: 用户ID
 * 参数 strToSign:
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data:
 *     {
 *       base_doc_id: 12,
 *       create_time: "2016-04-27 09:30:56",
 *       thumb: "http://xxxx.jpg",
 *       title: "文档名称",
 *       track: 1,// 是否追踪
 * }
 * */
function getOssSign(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");   //设置跨域访问


    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;
    var user_id = req.body.user_id || req.query.user_id;
    var strToSign = req.body.strToSign || req.query.strToSign || '';
    console.log('home.js [getOssSign] strToSign: ' + strToSign);

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if(typeof user_id=='undefined' || user_id == null || user_id.trim().length == 0){
        return ret_func(0,CODE.USER_ID_EMPTY);
    }

    var deadLine = Date.parse(new Date()) / 1000 + 3600;// 1小时以后
    var policyText = {
        "expiration": deadLine, // 设置该Policy的失效时间
        "conditions": [
            ["content-length-range", 0, 104857600] // 100M
        ]
    };
    //var strToSign = JSON.stringify(policyText);
    var myOSS = OSSMgr.get(CONFIG.BUCKET_ITBOUR_USER);
    if (myOSS) {
        var sign = myOSS.signature(strToSign);
        var retData = {
            expiration: deadLine,
            accessKeyId: myOSS.options.accessKeyId,
            stringToSign: strToSign,
            signature: sign,
        };
        console.log('home.js [getOssSign] retData: ' + JSON.stringify(retData));
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    } else {
        return ret_func(0,CODE.OPERATION_FAILED);
    }

}
router.get('/getOssSign', getOssSign);
router.post('/getOssSign', getOssSign);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 获取通知消息 (默认获取当前日时下最早的一条有效消息)
 * 方式:GET/POST
 * 参数 device: 0表示从pc,1表示iOS,2表示android
 * 参数 uuid: 设备标识
 * 参数 type: 消息类型,默认为1 (1:普通message, 2:横幅banner信息)
 * 参数 time(可选): 获取[指定日时]的有效消息, YYYYMMDDhhmmss (14位年月日十分秒)
 * 参数 start_time(可选): 获取[指定开始日时]之后的有效消息, YYYYMMDDhhmmss (14位年月日十分秒)
 * 参数 end_time(可选): 获取[指定结束日时]之前的有效消息, YYYYMMDDhhmmss (14位年月日十分秒)
 * 返回:
 * {
 *   success: 1,
 *   msg: 成功，
 *   data:
 *     {
 *       title: 123,
 *       message: XXXXX,
 *       image: yyy,
 *       url: zzz
 *     }
 * */
function getNotification(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;
    var type = Number(req.body.type || req.query.type || 1);// 默认为1
    var start = req.body.start_time || req.query.start_time || null;
    var end = req.body.end_time || req.query.end_time || null;
    var time = req.body.time || req.query.time || null;

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if((time && time.length != 14) ||
        (start && start.length != 14) ||
        (end && end.length != 14)){
        return ret_func(0,'日期格式错误');
    }

    var entity = new ItbNotificationModel({
        type:type,
        time:time,
        start_time:start,
        end_time:end
    });
    entity.getMessage(function(err, items) {
        if (err) {
            console.log('home.js [getNotification] get message error: ' + err);
            return ret_func(0, CODE.OPERATION_FAILED);
        }

        var retData = {
            title:'',
            message:'',
            image:'',
            url:''
        };
        if(items && items.length>0){
            retData.title = items[0].title || '';
            retData.message = items[0].message || '';
            retData.image = items[0].image || '';
            retData.url = items[0].url || '';
        }
        return ret_func(1,CODE.OPERATION_SUCCESS,retData);
    });
}
router.get('/getNotification', getNotification);
router.post('/getNotification', getNotification);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 随机切换模板
 * 方式:GET/POST
 * 参数 device: 0表示从pc来的请求1表示ios/2表示android/101表示pc美化大师/102表示pc wps/103表示wps android/104表示wps ios
 * 参数 uuid: 设备标识
 * 参数 docId: 当前文档id
 * 参数 userId: 用户id
 * 参数 usedIds(可选): 切换过的模版id(数组字符串 '[1,2,3]')
 * 返回:
 {
     "success": 1,
     "msg": "成功",
     "data": {
         "tmpl_id": 100,// 当前切换到的模版id
         "preview": [
             {
             "image": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg",
             "pageId": 345
             },
             {
             "image": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg",
             "pageId": 346
             }
         ],
         "history": [ // 最后一个为当前 preview 对应的模板
             {
             "tmpl_id": 1,
             "thumb": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg"
             },
             {
             "tmpl_id": 1,
             "thumb": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg"
             }
         ]
     }
 }
 * */
function switchTmpl(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;
    var uuid = req.body.uuid || req.query.uuid;
    var docId = Number(req.body.docId || req.query.docId || '0');
    var userId = Number(req.body.userId || req.query.userId || '0');
    var usedIds = JSON.parse(req.body.usedIds || req.query.usedIds || '[]');

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    if (typeof docId=='undefined' || isNaN(docId) || docId==null || docId==0) {
        return ret_func(0,"用户文档id为空");
    }
    if (typeof userId=='undefined' || isNaN(userId) || userId==null || userId==0) {
        return ret_func(0,"无效用户id");
    }

    var url = CONFIG.SWITCH_SERVER_DOMAIN +':'+CONFIG.SWITCH_SERVER_PORT+'/switch/switchTmpl?'
        +'docId='+docId
        +'&userId='+userId
        +'&usedIds='+JSON.stringify(usedIds);

    superagent.get(url)
        .end(function(err, res2){
            if(err){
                console.log('home.js [switchTmpl] SuperAgent get Err: ' + err);
                return ret_func(0, CODE.OPERATION_FAILED);
            }

            console.log('home.js [switchTmpl] SuperAgent get:\n'+res2.text);
            var retJson = JSON.parse(res2.text);
            if(retJson.success){

                // 获取preview
                var entity = new ItbPageModel({
                    doc_ids:docId
                });
                entity.getPagesInfoByDocIds(function(error, items){
                    if(error){
                        console.log('home.js [switchTmpl] getPagesInfoByDocIds Err: '+error);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    // process success
                    var pageData = [];
                    if (items != null && items.length > 0) {
                        for (var i in items){
                            var item = items[i];

                            // 只要有未生成预览图的页面就返回error TODO
                            //if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                            //    return ret_func(0,CODE.PAGE_THUMB_EMPTY);
                            //}

                            // 组合page数据
                            var pageItem = {
                                pageId: item.page_id,
                                image: item.thumb_s||''
                            };
                            pageData.push(pageItem);
                        }
                    }

                    var retData={
                        tmpl_id: retJson.data.tmpl_id||'',
                        preview: pageData,
                        history: retJson.data.history||[]
                    };

                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                });
            } else {
                return ret_func(0, retJson.msg);
            }
        });
}
router.get('/switchTmpl', switchTmpl);
router.post('/switchTmpl', switchTmpl);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 切换至指定模板
 * 方式:GET/POST
 * 参数 device: 0表示从pc来的请求1表示ios/2表示android/101表示pc美化大师/102表示pc wps/103表示wps android/104表示wps ios
 * 参数 uuid: 设备标识
 * 参数 docId: 当前文档id
 * 参数 userId: 用户id
 * 参数 tmplId: 目标模版id
 * 返回:
 {
     "success": 1,
     "msg": "成功",
     "data": {
         "tmpl_id": 100,// 当前切换到的模版id
         "preview": [
             {
             "image": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg",
             "pageId": 345
             },
             {
             "image": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg",
             "pageId": 346
             }
         ],
         "history": [
             {
             "tmpl_id": 1,
             "thumb": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg"
             },
             {
             "tmpl_id": 1,
             "thumb": "http://itbour-generate.itbour.com/image/U8/2016/04/12/111736242_9195288177579642/0.jpg"
             }
         ]
     }
 }
 * */
function switchTo(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;
    var uuid = req.body.uuid || req.query.uuid;
    var docId = Number(req.body.docId || req.query.docId || '0');
    var userId = Number(req.body.userId || req.query.userId || '0');
    var tmplId = Number(req.body.tmplId || req.query.tmplId || '0');


    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    if (typeof docId=='undefined' || isNaN(docId) || docId==null || docId==0) {
        return ret_func(0,"用户文档id为空");
    }
    if (typeof tmplId=='undefined' || isNaN(tmplId) || tmplId==null || tmplId==0) {
        return ret_func(0,"目标模版id为空");
    }
    if (typeof userId=='undefined' || isNaN(userId) || userId==null || userId==0) {
        return ret_func(0,"无效用户id");
    }

    var url = CONFIG.SWITCH_SERVER_DOMAIN +':'+CONFIG.SWITCH_SERVER_PORT+'/switch/switchTo?'
        +'docId='+docId
        +'&userId='+userId
        +'&tmplId='+tmplId;

    superagent.get(url)
        .end(function(err, res2){
            if(err){
                console.log('home.js [switchTo] SuperAgent get Err: ' + err);
                return ret_func(0, CODE.OPERATION_FAILED);
            }

            console.log('home.js [switchTo] SuperAgent get:\n'+res2.text);
            var retJson = JSON.parse(res2.text);
            if(retJson.success){

                // 获取preview
                var entity = new ItbPageModel({
                    doc_ids:docId
                });
                entity.getPagesInfoByDocIds(function(error, items){
                    if(error){
                        console.log('home.js [switchTo] getPagesInfoByDocIds Err: '+error);
                        return ret_func(0,CODE.OPERATION_FAILED);
                    }

                    // process success
                    var pageData = [];
                    if (items != null && items.length > 0) {
                        for (var i in items){
                            var item = items[i];

                            // 只要有未生成预览图的页面就返回error TODO
                            //if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                            //    return ret_func(0,CODE.PAGE_THUMB_EMPTY);
                            //}

                            // 组合page数据
                            var pageItem = {
                                pageId: item.page_id,
                                image: item.thumb_s||''
                            };
                            pageData.push(pageItem);
                        }
                    }

                    var retData={
                        tmpl_id: retJson.data.tmpl_id||'',
                        preview: pageData,
                        history: retJson.data.history||[]
                    };

                    return ret_func(1,CODE.OPERATION_SUCCESS,retData);
                });
            } else {
                return ret_func(0, retJson.msg);
            }
        });
}
router.get('/switchTo', switchTo);
router.post('/switchTo', switchTo);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 获取文档预览图（无预览时自动排版一次）及切换历史记录
 * 方式:GET/POST
 * 参数 device: 0表示从pc来的请求1表示ios/2表示android/101表示pc美化大师/102表示pc wps/103表示wps android/104表示wps ios
 * 参数 uuid: 设备标识
 * 参数 docId: 当前文档id
 * 参数 userId: 用户id
 * 参数 his: 是否获取历史记录, 0: 不获取, 1 获取
 * 返回: ［结构同切换模版］
 * */
function getDocPreviewEx(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;
    var uuid = req.body.uuid || req.query.uuid;
    var docId = Number(req.body.docId || req.query.docId || '0');
    var userId = Number(req.body.userId || req.query.userId || '0');
    var his = Number(req.body.his || req.query.his || '0');
    if(CONFIG.DEBUG==1) his=0;


    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    if (typeof docId=='undefined' || isNaN(docId) || docId==null || docId==0) {
        return ret_func(0,"用户文档id为空");
    }
    if (typeof userId=='undefined' || isNaN(userId) || userId==null || userId==0) {
        return ret_func(0,"无效用户id");
    }

    // 重新排版
    function getSwitchHis(userDocInfo, pageData){
        var retData={
            tmpl_id: userDocInfo.base_doc_id||'',
            audioUrls: JSON.parse(userDocInfo.audio||'[]'),
            preview: pageData||[],
            history: []
        };

        if(1 == his){
            var url = CONFIG.SWITCH_SERVER_DOMAIN +':'+CONFIG.SWITCH_SERVER_PORT+'/switch/getHisList?'
                +'docId='+docId
                +'&userId='+userId;

            superagent.get(url)
                .end(function(err, res2){
                    if(err){
                        console.log('home.js [getDocPreviewEx] SuperAgent getHisList Err: ' + err);
                        return ret_func(0, CODE.OPERATION_FAILED);
                    }

                    console.log('home.js [getDocPreviewEx] SuperAgent getHisList:\n'+res2.text);
                    var retJson = JSON.parse(res2.text);
                    if(retJson.success){
                        retData.history = retJson.data||[];
                        return ret_func(1,CODE.OPERATION_SUCCESS,retData);

                    } else {
                        return ret_func(0, retJson.msg);
                    }
                }
            );

        } else {
            return ret_func(1,CODE.OPERATION_SUCCESS,retData);
        }
    }

    // 获取文档
    var docEntity = new ItbDocumentModel({
        doc_id:docId,
        del_flg:0
    });
    docEntity.findFromDB(function (findErr, docs) {
        if (findErr) {
            console.log('home.js [getDocPreviewEx] find doc error: ' + findErr);
            return ret_func(0, CODE.OPERATION_FAILED);
        }

        if(docs && docs.length>0){
            var userDocInfo = docs[0];
            //var tmplId = docs[0].base_doc_id||'';

            // 获取preview
            var entity = new ItbPageModel({
                doc_ids:docId
            });
            entity.getPagesInfoByDocIds(function(error, items){
                if(error){
                    console.log('home.js [getDocPreviewEx] getPagesInfoByDocIds error: '+error);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                // process success
                var pageData = [];
                var doTypeset = false
                if (items != null && items.length > 0) {
                    for (var i in items){
                        var item = items[i];

                        // 只要有未生成预览图的页面就返回error
                        if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                            doTypeset = true;
                            break;
                        }

                        // 组合page数据
                        var pageItem = {
                            pageId: item.page_id,
                            image: item.thumb_s||''
                        };
                        pageData.push(pageItem);
                    }
                }

                if (doTypeset) {
                    // 重新排版
                    rpcFunc.typesetDoc(docId, function (ret) {
                        // 再次获取
                        entity.getPagesInfoByDocIds(function (err, items2) {
                            if (err) {
                                console.log('home.js [getDocPreviewEx] Re-getPagesInfoByDocIds error: ' + err);
                                return ret_func(0, CODE.OPERATION_FAILED);
                            }

                            // process success
                            pageData = [];
                            if (items2 != null && items2.length > 0) {
                                for (var n in items) {
                                    var item = items2[n];

                                    // 只要有未生成预览图的页面就返回error
                                    if (item.thumb_s == null || item.thumb_s.trim().length == 0) {
                                        return ret_func(0, CODE.PAGE_THUMB_EMPTY);
                                    }

                                    // 组合page数据
                                    var pageItem = {
                                        pageId: item.page_id,
                                        image: item.thumb_s||''
                                    };
                                    pageData.push(pageItem);
                                }
                            }

                            return getSwitchHis(userDocInfo, pageData);
                        });
                    });
                } else {
                    // 无需排版
                    return getSwitchHis(userDocInfo, pageData);
                }
            });

        } else {
            return ret_func(0, "未检索到文档");
        }
    });

}
router.get('/getDocPreviewEx', getDocPreviewEx);
router.post('/getDocPreviewEx', getDocPreviewEx);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 更新用户文档音频
 * 方式:POST
 * [必须]参数: device : 来源
 * [必须]参数: uuid : 设备唯一标识符
 * [必须]参数: userId : 用户id
 * [必须]参数: docId : 文档id
 * [必须]参数: audio : 音频地址[数组]
 * */
function updDocAudio(req, res, next) {
    // get parameter
    var device = req.body.device || req.query.device;// TODO
    var uuid = req.body.uuid || req.query.uuid;

    var userId = Number(req.body.userId || req.query.userId || '0');
    var docId = Number(req.body.docId || req.query.docId || '0');
    var audio = req.body.audio || req.query.audio || [];

    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    // check parameter
    if (typeof docId=='undefined' || isNaN(docId) || docId==null || docId==0) {
        return ret_func(0,"用户文档id为空");
    }
    if (typeof userId=='undefined' || isNaN(userId) || userId==null || userId==0) {
        return ret_func(0,"无效用户id");
    }

    // 检索user
    var chkEnt = new ItbDocumentModel({
        doc_id : docId,
        user_id : userId,
        del_flg : 0
    });
    chkEnt.findFromDB(function(error, items){
        if (error){
            console.log('home.js [updDocAudio] Chk UserDoc Err: '+error);
            return ret_func(0,CODE.OPERATION_FAILED);
        }

        if (items != null && items.length > 0) {
            var docInfo = items[0];

            var updEnt = new ItbDocumentModel({
                doc_id: docId,
                user_id : userId,
                audio: JSON.stringify(audio)
            });
            updEnt.updDocAudio(function(error2, ret){
                if (error2) {
                    console.log('home.js [updDocAudio] updDocAudio Err: '+error2);
                    return ret_func(0,CODE.OPERATION_FAILED);
                }

                return ret_func(1,CODE.OPERATION_SUCCESS);
            });

        } else {
            return ret_func(0, "未找到匹配文档");
        }
    });
}
router.get('/updDocAudio', updDocAudio);
router.post('/updDocAudio', updDocAudio);
//------------------------------------------------------------------

//------------------------------------------------------------------
/* 发邮件
 * 参数：to: 收件人地址（多个时以逗号分隔: 'xiaochi@itbour.com,liumin@itbour.com'）
 * 参数：subject：主题
 * 参数：html：
 * 测试地址：http://localhost:3000/home/sendMail?to=xiaochi@itbour.com&subject=一键生成－秒杀商品－Logo&html=<b>下载地址</b><b>http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U401486/2017/08/07/113922787_iJfiolOa2zVkauuuapfo/0.jpg</b>
 * */
function sendMail(req, res, next) {
    // get parameter
    var to = req.body.to || req.query.to || "";
    var subject = req.body.subject || req.query.subject || "";
    var text = req.body.text || req.query.text || "";
    var html = req.body.html || req.query.html || "";


    // return function
    function ret_func(success, msg, data){
        var obj = {
            success: success,
            msg: msg,
            data: data
        };
        // 返回
        res.set('Content-Type', 'application/json');
        res.json(obj);
    }

    if (to.length < 1) {
        return ret_func(0,"收件人地址为空")
    }

    var transporter = nodemailer.createTransport({
        host: 'smtpdm.aliyun.com',
        secureConnection: true,// use SSL
        port: 465,// port for secure SMTP
        auth: {
            user: 'send@automail.itbour.com',
            pass: 'xiqihErRoirh87399'
        }
    });

    var mailOptions = {
        from: '"自动发送，请勿回复"<send@automail.itbour.com>', // sender address
        to: to, // list of receivers
        //cc: 'xiaochi@itbour.com',
        //bcc: 'xiaochi@itbour.com',
        subject: subject, // Subject line
        text: text, // plaintext body
        html: html // html body
    };

    transporter.sendMail(mailOptions, function(error, info){
        if(error){
            console.log(error);
            ret_func(0, error.message);
        }else{
            console.log('Message sent: ' + info.response);
            ret_func(1, info.response);
        }
    });
}
router.get('/sendMail', sendMail);
router.post('/sendMail', sendMail);
//------------------------------------------------------------------

module.exports = router;
